Как вы можете использовать виджеты tkinter для файлов в python? - PullRequest
0 голосов
/ 31 марта 2019

Я относительно новичок в программировании, и я заметил, что кодирование всего в 2 файлах (настройки и основной) становится очень грязным по мере роста вашего кода.Однако, когда я делю свой код на множество файлов, у меня возникают проблемы, когда я не могу импортировать fileB.py в файл FileA.py и использовать переменные или виджеты из файла A внутри моего файла B (я получаю ошибку с неопределенными именами).

Я использую tkinter для пользовательского интерфейса, поэтому мой основной файл - цикл tk (main.py).Каждая кнопка относится к функциям в разных файлах.Это работает хорошо, пока моя функция не включает состояния кнопок или текст ввода.

Этот пример с tkinter, но я сталкивался с этой проблемой много раз, из-за моей структуры кода, я верю.

Файл A (main.py)

import FileB
import tkinter
from tkinter import Checkbutton, Tk, Entry, BooleanVar

root = Tk() # initialize blank window
root.geometry("500x500")

# text entry
E1 = Entry(root, bd=5, width = 8)
E1.grid(row=0, column=1)

# Checkbox
CB_var = BooleanVar()
CB = Checkbutton(root, text="Get text", variable=CB_var, command=FileB.get_text() )
CB.grid(row=0, column=2)

root.mainloop()

FileB (FileB.py)

def get_text():
    if CB.var == True:
         entry_text = E1.get()
         E1.config(state=DISABLED)
         print(entry_text)
         E1.delete(0, END)
    elif CB.var == False:
         E1.config(state=NORMAL)
         print("Checkbox not selected")

Поскольку E1 определен до вызова моей функции, я ожидаю, что моя функция сможет изменять состояние E1, получать его текст и очищать текст;как если бы функция была в моем main.py.

Фактический вывод - неопределенная ошибка имени, так как E1 не является переменной в моем FileB.

1 Ответ

0 голосов
/ 01 апреля 2019

Поскольку FileB импортируется main.py, FileB не может получить доступ к объектам в main.py. Вам необходимо передать объекты в main.py через параметры функции.

Предложите поместить ваши виджеты в класс и передать экземпляр класса функции FileB.get_text().

Файл A (main.py)

from tkinter import Checkbutton, Tk, Entry, BooleanVar
import FileB

class GUI:
    def __init__(self, root=None):
        # text entry
        self.E1 = Entry(root, bd=5, width = 8)
        self.E1.grid(row=0, column=1)
        # Checkbox
        self.CB_var = BooleanVar()
        self.CB = Checkbutton(root, text="Get text", variable=self.CB_var, command=lambda: FileB.get_text(self))
        self.CB.grid(row=0, column=2)

root = Tk() # initialize blank window
root.geometry("500x500")
GUI(root)
root.mainloop()

Файл B (FileB.py)

from tkinter import DISABLED, NORMAL, END

def get_text(gui):
    if gui.CB_var.get() == True:
         entry_text = gui.E1.get()
         gui.E1.config(state=DISABLED)
         print(entry_text)
         gui.E1.delete(0, END)
    else:
         gui.E1.config(state=NORMAL)
         print("Checkbox not selected")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...