2016-12-05 2 views
0

Я хочу сделать простую графическую программу Python с Tkinter. Я загрузил winPython и извлек его каталог python3.5.2 в качестве моей среды python.Как я могу получить доступ или настроить атрибут виджета Tkinter из отдельного класса в python?

Затем я использовал SpecTcl GUI builder, указанный в this thread. Я построил простой графический интерфейс с этим построителем, GUI содержит только кнопку и текстовую область. Создатель создает 2 файла python, один - «SimpleGUI_ui.py», другой - «SimpleGUI.py». Я поместил оба файла .py в каталог python3.5.2 и запустил python3.5.2.exe SimpleGUI.py для отображения графического интерфейса.

Ниже приведен код SimpleGUI.py. Опущены некоторые коды, которые не очень важны.

""" simpleGUI.py -- 
UI generated by GUI Builder Build 146 on 2016-12-05 22:47:05 from: 
C:/Users/User/Downloads/guimaker/simpleGUI.ui 
This file is auto-generated. Only the code within 
'# BEGIN USER CODE (global|class)' 
'# END USER CODE (global|class)' 
and code inside the callback subroutines will be round-tripped. 
The 'main' function is reserved. 
""" 
from tkinter import * 
from simpleGUI_ui import SimpleGUIcd 
# BEGIN USER CODE global 
# END USER CODE global 
class CustomSimpleGUI(SimpleGUI): 
    pass 

    # BEGIN CALLBACK CODE 
    # ONLY EDIT CODE INSIDE THE def FUNCTIONS. 
    # _button_1_command -- 
    # Callback to handle _button_1 widget option -command 
    def _button_1_command(self, *args): 
     SimpleGUI._text_1.config(text="hello world") # This is useless 

    # _text_1_xscrollcommand -- 
    # Callback to handle _text_1 widget option -xscrollcommand 
    def _text_1_xscrollcommand(self, *args): 
     pass 
    # I omit another yScrollCommand here. 

def main(): 
    # Standalone Code Initialization, DO NOT EDIT 
    try: userinit() 
    except NameError: pass 
    root = Tk() 
    demo = CustomSimpleGUI(root) 
    root.title('simpleGUI') 
    try: run() 
    except NameError: pass 
    root.protocol('WM_DELETE_WINDOW', root.quit) 
    root.mainloop() 
if __name__ == '__main__': main() 

Ниже SimpleGUI_ui.py код:

""" simpleGUI_ui.py -- 
UI generated by GUI Builder Build 146 on 2016-12-05 22:47:05 from: 
C:/Users/User/Downloads/guimaker/simpleGUI.ui 
THIS IS AN AUTOGENERATED FILE AND SHOULD NOT BE EDITED. 
The associated callback file should be modified instead. 
""" 
import tkinter 
import os # needed for relative image paths 
class SimpleGUI(object): 
    _images = [] # Holds image refs to prevent GC 
    def __init__(self, root): 
     # Widget Initialization 
     self._button_1 = tkinter.Button(root, 
      text = "_button_1", 
     ) 
     self._text_1 = tkinter.Text(root, 
      height = 0, 
      width = 0, 
     ) 
     # widget commands 
     self._button_1.configure(
      command = self._button_1_command 
     ) 
     self._text_1.configure(
      xscrollcommand = self._text_1_xscrollcommand 
     ) 
     self._text_1.configure(
      yscrollcommand = self._text_1_yscrollcommand 
     ) 
     # Geometry Management 
     self._button_1.grid(
      in_ = root, 
      column = 1, 
      row = 1, 
      columnspan = 1, 
      ipadx = 0, 
      ipady = 0, 
      padx = 0, 
      pady = 0, 
      rowspan = 1, 
      sticky = "" 
     ) 
     self._text_1.grid(
      in_ = root, 
      column = 1, 
      row = 2, 
      columnspan = 1, 
      ipadx = 0, 
      ipady = 0, 
      padx = 0, 
      pady = 0, 
      rowspan = 1, 
      sticky = "news" 
     ) 
     # Resize Behavior 
     root.grid_rowconfigure(1, weight = 0, minsize = 40, pad = 0) 
     root.grid_rowconfigure(2, weight = 0, minsize = 40, pad = 0) 
     root.grid_columnconfigure(1, weight = 0, minsize = 40, pad = 0) 
     root.grid_columnconfigure(2, weight = 0, minsize = 40, pad = 0) 

Так я последовал за его комментарий: изменить обратные вызовы, но не _ui код.

Теперь проблема, с которой я столкнулся, - это не просто изменить текст внутри виджета _text_1. Я пытался позвонить SimpleGUI._text_1.config(text="hello world"), но он дал мне исключение ниже, когда я нажал на кнопку на GUI:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\User\Downloads\python-3.5.2\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
    File "simpleGUI.py", line 29, in _button_1_command 
    SimpleGUI._text_1.config(text="hello world") 
AttributeError: type object 'SimpleGUI' has no attribute '_text_1' 

Может кто-нибудь, пожалуйста, помогите мне, как я мог бы принять _text_1 виджет и настроить его текст в функции обратного вызова, так что я может сделать мой графический интерфейс интерактивным, и, надеюсь, я мог бы использовать один и тот же способ доступа к & для управления любыми другими виджетами в графическом интерфейсе. Благодаря!

+1

Идентификаторы, начинающиеся с подчеркивания, являются частными, к ним нельзя получить доступ за пределами класса. Вам необходимо создать методы, которые изменяют их в соответствии с вашими потребностями, и вызывать эти методы из других классов. – DyZ

+0

Привет @DYZ благодарит за ваш ответ, так что вы имеете в виду без каких-либо изменений в 'SimpleGUI_ui.py', нет никакого способа получить доступ к виджету GUI? Хотя комментарий в коде говорит, что 'SimpleGUI_ui.py' не нужно редактировать. –

ответ

0

Слишком плохо, что я не смог найти способ доступа к виджету без изменения кода SimpleGUI_ui.py. @DYZ прав, я добавил функцию в SimpleGUI_ui.py и в функции обратного вызова SimpleGUI.py Я вызвал эту функцию, передал self в качестве 1-го параметра, затем успешно обратился к виджету.

В SimpleGUI_ui.py:

class MailLogChecker(object): 
    # other code omitted 
    def foo(self): 
     self._text_1.insert(1.0, 'abc') 

В SimpleGUI.py:

class CustomSimpleGUI(SimpleGUI): 
    # other code omitted 
    def _button_1_command(self, *args): 
     # call like this and pass self to access widgets in UI 
     SimpleGUI.foo(self) 

Я все еще ищу способ, что изменение только SimpleGUI.py является достаточным для доступа виджета пользовательского интерфейса. В любом случае, спасибо за @DYZ, давая мне подсказку.

Смежные вопросы