2009-04-14 20 views
5

Tôi có một dự án nhỏ có sử dụng libglade và sử dụng sau đây để tải các tập tin xml:Các bước để chuyển đổi từ sử dụng libglade sang GtkBuilder là gì? (Python)

self.gladefile = "sdm.glade" 
self.wTree = gtk.glade.XML(self.gladefile) 
self.window = self.wTree.get_widget("MainWindow") 
if (self.window): 
    self.window.connect("destroy", gtk.main_quit) 
dic = { "on_button1_clicked" : self.button1_clicked, 
     "on_MainWindow_destroy" : gtk.main_quit} 
self.wTree.signal_autoconnect(dic) 

Sau khi chuyển đổi dự án của tôi trong glade, những gì thay đổi cấu trúc để tôi cần phải thực hiện? Tôi đang sử dụng Ubuntu 9.04.

Trả lời

11

Thay vào đó, bạn cần sử dụng gtk.Builder. Lớp này có thể tải mọi số lượng file UI, vì vậy bạn cần phải thêm chúng bằng tay, hoặc như các file hoặc như dây đàn:

self.uifile = "sdm.ui" 
self.wTree = gtk.Builder() 
self.wTree.add_from_file(self.uifile) 

Thay vì get_widget, chỉ cần sử dụng get_object trên lớp builder:

self.window = self.wTree.get_object("MainWindow") 
if self.window: 
    self.window.connect("destroy", gtk.main_quit) 

để kết nối các tín hiệu, chỉ cần sử dụng connect_signals, mà cũng có một cuốn từ điển:

dic = { "on_button1_clicked" : self.button1_clicked, 
    "on_MainWindow_destroy" : gtk.main_quit} 
self.wTree.connect_signals(dic) 

Nó từng là trường hợp (ít nhất là trong GTK + 2.12, không chắc chắn nếu tôi t vẫn giống nhau) mà bạn có thể gọi connect_signals chỉ một lần, bất kỳ tín hiệu nào không được kết nối trong lần gọi đầu tiên sẽ không bao giờ được kết nối. Điều này là khác nhau trong glade, vì vậy hãy cẩn thận nếu bạn dựa vào tính năng đó trước đây.

5

Torsten của câu trả lời là đúng, nhưng một chút không đầy đủ, vì vậy theo tinh thần http://xkcd.com/979/ đây là thủ tục Gần đây tôi đã giải quyết trên sau nhiều thử nghiệm và lỗi:

mở yada.glade trong thiết kế giao diện Glade. Vào edit-> project và thay đổi kiểu dự án thành GtkBuilder và chắc chắn rằng nó nhắm vào phiên bản mới nhất (2.24 như bài viết này). Lưu tập tin, là chắc chắn rằng nó tiết kiệm ở định dạng GtkBuilder, và thay đổi tên từ yada.glade để yada.ui

mở yada.py và thay đổi đoạn mã sau:

gladefile = relativize_filename(os.path.join("glade", "yada.glade")) 
self.wTree = gtk.glade.XML(gladefile, self.windowname) 

tới:

uifile = relativize_filename(os.path.join("glade", "yada.ui")) 
self.wTree = gtk.Builder() 
self.wTree.add_from_file(uifile) 

Tương tự thay đổi tất cả các trường hợp của self.wTree.get_widget(...) để self.wTree.get_object(...)

thay đổi self.wTree.signal_autoconnect(dic)-self.wTree.connect_signals(dic)

Nếu mã của bạn tùy thuộc vào tên được gán tiện ích trong trình thiết kế giao diện, hãy thay đổi widget.get_name() thành gtk.Buildable.get_name(widget). widget.get_name() hiện chỉ trả về loại tiện ích. CHỈNH SỬA: Bạn cũng cần thay đổi widget.set_name('my_widget') thành gtk.Buildable.set_name(widget, 'my_widget').

Xóa import gtk.glade

tôi thấy nhiều tín hiệu không sử dụng được định nghĩa trong file xml yada.ui, tôi đã phải mở file xml và tự xóa chúng để loại bỏ các cảnh báo họ gây ra.