2017-02-20 32 views
0

У меня возникли проблемы с запуском диалогового окна из Python3/PyGObject, которое я создал с помощью дизайнера интерфейса Glade. Сигналы не подключены правильно, так как я получаю эту ошибку, когда я пытаюсь запустить этот скрипт:Как правильно запустить диалог из Python3/PyGObject, который был сгенерирован с использованием Glade

AttributeError: Handler button_click_dialog not found

Кроме того, я не знаю, где я могу установить мое переходное родительское окно:

Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Здесь моя поляна файл: http://pastebin.com/yKz3P58s

А вот мой python3/PyGObject файл:

#!/usr/bin/env python3 

# Gtk imports 
import gi 
gi.require_version("Gtk", "3.0") 
from gi.repository import Gtk 

# Initialize Gtk builder and import UI 
builder = Gtk.Builder() 
builder.add_from_file("windowtest.glade") 

# Get objects from builder 
window = builder.get_object("ButtonWindow") 
dialog = builder.get_object("ButtonDialog") 

class ButtonWindow: 

    def on_delete_window(self, *args): 
    Gtk.main_quit(*args) 

    def button_click_window(self, widget): 
    print("button_click_window") 
    response = dialog.run() 
    if response == Gtk.ResponseType.OK: 
     print("OK") 
    elif response == Gtk.ResponseType.CANCEL: 
     print("CANCEL") 
    dialog.destroy() 


class ButtonDialog: 

    def __init__(self): 
    print("dialog init") 

    def button_click_dialog(self, widget): 
    print("button_click_dialog") 


# Connect signals 
builder.connect_signals(ButtonWindow()) 
builder.connect_signals(ButtonDialog()) 

# Show main window 
window.show_all() 

# Enter main loop 
Gtk.main() 

Может кто-нибудь помочь мне понять, как позвонить/запустить/уничтожить мой диалог? И как я должен подключать сигналы?

ответ

0

AttributeError: Handler button_click_dialog not found

Проблема заключается в том, что вы подключаете два класса с тем же строитель объекта здесь:

builder.connect_signals(ButtonWindow()) 
builder.connect_signals(ButtonDialog()) 

Таким образом, вы можете переместить функцию button_click_dialog в ButtonWindow класса или сохранить ваш диалог в отдельном файл.


Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Вы можете позвонить set_transient_for, например, при нажатии на кнопку

def button_click_window(self, widget): 
    print("button_click_window") 
    dialog.set_transient_for(window) 
    response = dialog.run() 
    if response == Gtk.ResponseType.OK: 
     print("OK") 
    elif response == Gtk.ResponseType.CANCEL: 
     print("CANCEL") 
    dialog.destroy() 

Он также может иметь смысл перейти от dialog.destroy() к dialog.hide() в случае, если вы хотите, чтобы иметь возможность вызвать диалог несколько раз и не один раз.

+0

Спасибо за ваш ответ, elya5. Мне было бы очень интересно разделить эти два на свои собственные файлы. Проблема в том, что я попробовал это, как вы объяснили, но я не понял. Можете ли вы помочь мне исправить это? windowwindow.py: http://pastebin.com/MW8dRLys windowdialog.py: http://pastebin.com/1nCAUSjc windowtest.glade: без изменений. – mursuhaukka

+0

Поместите окно и диалог в два отдельных файла поляны – elya5

+0

Хорошо. Как мне импортировать, создавать экземпляры и запускать диалог, когда мой диалог находится в отдельном файле? У меня такие же .py-файлы, как и раньше. – mursuhaukka