Как мне назначить функцию кнопке, чтобы при нажатии она отображала строку в окне Text()?

#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()
 

Я надеюсь, что эта дополнительная информация поможет!