#python #python-3.x #tkinter
#python #python-3.x #tkinter
Вопрос:
Я пытаюсь создать программу с графическим интерфейсом, в которой я назначаю функцию кнопке, чтобы при нажатии она возвращала текст. Однако у меня возникают проблемы с этим.
from tkinter import *
class PayrollSummary:
def __init__(pay):
window = Tk()
window.title("Employee Payroll")
#Add Frame 1
frame1 = Frame(window)
frame1.pack()
#Add ReadFile Button
btReadFile = Button(frame1, text = "Read File")
#Add ShowPayroll Button
btShowPayroll = Button(frame1, text = "Show Payroll") #When I press the button "Show Payroll", I want it to display a text in the textbox in the frame below. I tried command = printPayroll but i dont think its working :(
#printPayroll <- use this function to do so
#Formatting
btReadFile.grid(row = 1, column = 2, sticky="w")
btShowPayroll.grid(row = 2, column = 2, sticky="w")
#Text Window
text = Text(window)
text.pack()
text.insert(END, "text displayed from btShowPayroll") #when btShowPayroll is pressed I want it to display text here!
window.mainloop()
PayrollSummary()
Ответ №1:
Вам нужно добавить команду к кнопке click and move text.вставить в новую функцию следующим образом:
from tkinter import *
class PayrollSummary:
def __init__(self):
window = Tk()
window.title("Employee Payroll")
#Add Frame 1
frame1 = Frame(window)
frame1.pack()
#Add ReadFile Button
btReadFile = Button(frame1, text = "Read File")
#Add ShowPayroll Button
btShowPayroll = Button(frame1, text = "Show Payroll", command = self.printPayroll) #When I press the button "Show Payroll", I want it to display a text in the textbox in the frame below. I tried command = printPayroll but i dont think its working :(
#printPayroll <- use this function to do so
#Formatting
btReadFile.grid(row = 1, column = 2, sticky="w")
btShowPayroll.grid(row = 2, column = 2, sticky="w")
#Text Window
self.text = Text(window)
self.text.pack()
window.mainloop()
def printPayroll(self):
self.text.insert(END, "text displayed from btShowPayroll n") #when btShowPayroll is pressed I want it to display text here!
PayrollSummary()
Комментарии:
1. Трассировка (последний последний вызов): File «/Users/myname/Desktop/stkcoverflow.py «, строка 37, в файле <module> PayrollSummary() «/Users/myname/Desktop/stkcoverflow.py «, строка 18, в init btShowPayroll = Кнопка (frame1, text = «Показать платежную ведомость», command = self.printPayroll) #Когда я нажимаю кнопку «Показать платежную ведомость», я хочу, чтобы она отображала текст в текстовом поле в рамке ниже. Я попробовал command = printPayroll, но я не думаю, что это работает: ( AttributeError: объект ‘PayrollSummary’ не имеет атрибута ‘printPayroll’
2. @Tom спасибо, что поделился этим. Это ошибка из-за неправильного отступа функции
Ответ №2:
Я решил вашу проблему.
Для этого создайте метод / функцию класса PayrollSummary с именем ‘printpayroll’ и заставьте его вставить текст ‘текст, отображаемый из btShowPayroll’ в текстовое поле. Сделайте команду кнопки ‘lambda:self.printpayroll()’, чтобы она запускала метод / функцию.
from tkinter import *
class PayrollSummary:
def __init__(self):
window = Tk()
window.title("Employee Payroll")
#Add Frame 1
self.frame1 = Frame(window)
self.frame1.pack()
#Add ReadFile Button
self.btReadFile = Button(self.frame1, text = "Read File")
#Text Window
self.text = Text(window)
self.text.pack()
#Add ShowPayroll Button
self.btShowPayroll = Button(self.frame1, text = "Show Payroll", command = lambda:self.printpayroll()) #When I press the button "Show Payroll", I want it to display a text in the textbox in the frame below. I tried command = printPayroll but i dont think its working :(
#printPayroll <- use this function to do so
#Formatting
self.btReadFile.grid(row = 1, column = 2, sticky="w")
self.btShowPayroll.grid(row = 2, column = 2, sticky="w")
window.mainloop()
def printpayroll(self):
self.text.insert(END, "text displayed from btShowPayroll") #when btShowPayroll is pressed I want it to display text here!
PayrollSummary()
Этот код создает это окно при запуске:
Это то, что происходит при нажатии кнопки «Показать платежную ведомость»:
Как вы можете видеть, произошло то, что вы хотели. Текст выводится на экран. Это происходит потому, что текст вставляется в текстовое поле.
Некоторые рекомендации:
- Я рекомендую вам создать окно программы вне класса, потому что было бы лучше, чтобы в вашей программе было только одно окно, а затем несколько фреймов для каждого экрана GUI программы.
- Я рекомендую добавить self . перед множеством виджетов tkinter, которые вы создали в своем классе, чтобы они создавались как атрибуты объектов, которые создаются как экземпляры класса.
- Я рекомендую вам изменить код, который запускает класс, на:
PayrollSummaryScreen = PayrollSummary()
Я бы сделал это так, чтобы был создан объект PayrollSummaryScreen и чтобы каждый из созданных атрибутов объекта. например, frame1, btReadFile, btShowPayroll и text можно было получить с помощью объекта. Например, вы могли бы скрыть текст, если хотите, из-за пределов класса, используя:
PayrollSummaryScreen.text.pack_forget()
Это может быть полезно для вас в будущем, например, если вам нужно скрыть экран сводки заработной платы и, скрыв текстовое поле «текст» и кнопки «Прочитать файл» и «Показать платежную ведомость», вы можете скрыть атрибут frame1 объекта. Таким образом, это скрыло бы дочерние виджеты фрейма, которые являются текстовым полем «текст» и кнопками «Прочитать файл» и «Показать платежную ведомость».
Вы могли бы скрыть атрибут frame1 объекта экрана сводки заработной платы, используя:PayrollSummaryScreen.frame1.pack_forget()
Если бы вы приняли эти рекомендации, это был бы код:
from tkinter import *
window = Tk()
window.title("Employee Payroll")
class PayrollSummary:
def __init__(self):
#Add Frame 1
self.frame1 = Frame(window)
self.frame1.pack()
#Add ReadFile Button
self.btReadFile = Button(self.frame1, text = "Read File")
#Text Window
self.text = Text(window)
self.text.pack()
#Add ShowPayroll Button
self.btShowPayroll = Button(self.frame1, text = "Show Payroll", command = lambda:self.printpayroll()) #When I press the button "Show Payroll", I want it to display a text in the textbox in the frame below. I tried command = printPayroll but i dont think its working :(
#printPayroll <- use this function to do so
#Formatting
self.btReadFile.grid(row = 1, column = 2, sticky="w")
self.btShowPayroll.grid(row = 2, column = 2, sticky="w")
window.mainloop()
def printpayroll(self):
self.text.insert(END, "text displayed from btShowPayroll") #when btShowPayroll is pressed I want it to display text here!
PayrollSummaryScreen = PayrollSummary()
Я надеюсь, что эта дополнительная информация поможет!