Tkinter - Использование команды Button в классе для вызова функции из другого класса - PullRequest
0 голосов
/ 26 августа 2018

Моя программа использует кнопку из класса First для запуска функции в классе Second.Тем не менее, когда кнопка была нажата, мне нужно включить собственный аргумент, так как я могу вызвать другую функцию, используя предложенную здесь форму статического метода ( Python 3 Tkinter - Как вызвать функцию из другого класса ) или используя другой альтернативный способ решения этой проблемы.

Если вы можете подсказать мне, как использовать этот StringVar в классе Второй, мне будет легче, С уважением.

Единственная часть кода, которую я думаю, должна изменить:

self.traceButton=Button(self.main_inner_frame,text="Trace",command=Second.printSecondLine())

Код второго класса:

class Second(First):
    # @staticmethod
    def __init__(self,master):
        super().__init__(master)

    def printSecondLine(self):
        content = self.traceEntry.get()
        print(content)

Если вам нужноПолный код:

from tkinter import *
class First(Frame):
    def __init__(self,master):
        super().__init__()
        master.minsize(width=755, height=520)
        master.maxsize(width=755, height=520)
        Grid.config(self)

        # Run all function in [First Class]
        self.widget_size()
        #self.getTEXT()

    def widget_size(self):

        # Define a small frame for it
        self.main_inner_frame = LabelFrame(self,text="Tracing Method",height= 120,width =355)
        self.main_inner_frame.grid(row= 0, column=0)
        self.main_inner_frame.grid_propagate(0)

        # Create a button for it [When trace click it will show the text in the entry on terminal]
        self.traceButton = Button(self.main_inner_frame, text="Trace",command=Second.printSecondLine())
        self.traceButton.grid(row = 0, column = 1, sticky = W)

        # Create a entry box for the user
        # use a string variable tvar
        tvar = StringVar()
        self.traceEntry = Entry(self.main_inner_frame,textvariable=tvar,width=30)
        self.traceEntry.grid(row = 0, column = 2, sticky = W)

    # def getTEXT(self):
        # content = self.traceEntry.get()
        # print(content)

class Second(First):
    # @staticmethod
    def __init__(self,master):
        super().__init__(master)

    def printSecondLine(self):
        content = self.traceEntry.get()
        print(content)
        return content

if __name__ == '__main__':
    root = Tk()
    root.title("Good System")
    TIF = First(root)
    root.mainloop()

Ожидаемый результат Когда пользователь нажмет кнопку, запись получит текст и отобразится в терминале.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Решено. Я сделал несколько вещей, чтобы заставить ваш код работать в соответствии с вашими желаемыми спецификациями:

  1. добавил @staticmethod над методом printSecondLine ().
  2. удалил self из списка параметров printSecondLine ().
  3. заставил printSecondLine () принять параметр с именем value.
  4. потрошил и переписал тело метода printSecondLine () так, чтобы онфункции, как и предполагалось.
  5. использовал лямбда-выражение в конфигурации Button, чтобы данные можно было легко передавать.
  6. ставьте tvar в качестве параметра лямбда-выражения, так как это то, что вы пытаетесь передатьдля печатиSecondLine ()
  7. поместите код tvar и Entry над кодом Button.это может быть хорошо в другом порядке.но я думаю, что лучше поставить tvar выше, так как вы объявляете его перед тем, как получить к нему доступ от Button.

В любом случае, это работает.Вы вводите данные в запись, нажимаете кнопку, и данные отправляются на консоль.Возможно, вы захотите написать код, который очищает поле ввода после нажатия кнопки.Но это другая тема, и это не сложно сделать.

from tkinter import *

class First(Frame):
    def __init__(self,master):
        super().__init__()
        master.minsize(width=755, height=520)
        master.maxsize(width=755, height=520)
        Grid.config(self)

        # Run all function in [First Class]
        self.widget_size()


    def widget_size(self):

        # Define a small frame for it
        self.main_inner_frame = LabelFrame(self,text="Tracing Method",height= 120,width =355)
        self.main_inner_frame.grid(row= 0, column=0)
        self.main_inner_frame.grid_propagate(0)

        # Create a entry box for the user
        # use a string variable tvar
        tvar = StringVar()
        self.traceEntry = Entry(self.main_inner_frame,textvariable=tvar,width=30)
        self.traceEntry.grid(row = 0, column = 2, sticky = W)

        # Create a button for it [When trace click it will show the text in the entry on terminal]
        self.traceButton = Button(self.main_inner_frame, text="Trace",command=lambda: Second.printSecondLine(tvar))
        self.traceButton.grid(row = 0, column = 1, sticky = W)


class Second(First):
    @staticmethod
    def __init__(self,master):
        super().__init__(master)

    @staticmethod
    def printSecondLine(value):
        print(value.get())


if __name__ == '__main__':
    root = Tk()
    root.title("Good System")
    TIF = First(root)
    root.mainloop()
0 голосов
/ 26 августа 2018

при создании кнопок вы не можете установить команду command = для работы с паратезами '()', если не использовать лямбду, подобную этой.

self.traceButton = Button(self.main_inner_frame,text="Trace",
command= lambda: Second.printSecondLine())

Но это также должно работать:

 self.traceButton = Button(self.main_inner_frame, text="Trace",command=Second.printSecondLine)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...