Я хочу сделать простую графическую программу 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
виджет и настроить его текст в функции обратного вызова, так что я может сделать мой графический интерфейс интерактивным, и, надеюсь, я мог бы использовать один и тот же способ доступа к & для управления любыми другими виджетами в графическом интерфейсе. Благодаря!
Идентификаторы, начинающиеся с подчеркивания, являются частными, к ним нельзя получить доступ за пределами класса. Вам необходимо создать методы, которые изменяют их в соответствии с вашими потребностями, и вызывать эти методы из других классов. – DyZ
Привет @DYZ благодарит за ваш ответ, так что вы имеете в виду без каких-либо изменений в 'SimpleGUI_ui.py', нет никакого способа получить доступ к виджету GUI? Хотя комментарий в коде говорит, что 'SimpleGUI_ui.py' не нужно редактировать. –