Tkinter - Как связать и вызвать функцию - PullRequest
1 голос
/ 11 июля 2020

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

import tkinter as tk
from tkinter import *

class Example(Frame):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.master.title("Create Trusted Facts")
        self.pack(fill=BOTH, expand=True)

        frame2 = Frame(self)
        frame2.pack(fill=X)

        reqSumLbl = Label(frame2, text="Request Summary", width=22)
        reqSumLbl.pack(side='left', padx=5, pady=5)

        reqSumBox = Entry(frame2, width=100, bg="White", fg="lightgrey", borderwidth=1)
        reqSumBox.insert(0, "Enter the Request Summary here")
        reqSumBox.pack(fill=X, padx=50, pady=5, expand=True)
        reqSumBox.bind("<Button-1>", self.clear_reqSumBox)

    def clear_reqSumBox(self, reqSumBox):
        reqSumBox.delete(0, END)
        reqSumBox.config(fg="black")
        global SummaryText
        SummaryText = reqSumBox.get()

def main():
    root = Tk()
    root.geometry("500x550+350+50")
    app = Example()

    root.mainloop()

if __name__ == '__main__':
        main()

Ответы [ 3 ]

0 голосов
/ 11 июля 2020

Прежде всего, почему у вас есть два импорта в начале вашего Python скрипта, поскольку они обе являются одной и той же библиотекой, выберите один неверный.

Касательно вашего вопроса, это не удается, потому что вы не предоставил объект, на который щелкнули, он предоставил вам в качестве первого аргумента функции привязки событие, которое произошло.

Я рекомендую вам сделать ваш объект частью вашего текущего рабочего класса (пример класса), например :

import tkinter as tk
from tkinter import *

class Example(Frame):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.master.title("Create Trusted Facts")
        self.pack(fill=BOTH, expand=True)

        frame2 = Frame(self)
        frame2.pack(fill=X)

        reqSumLbl = Label(frame2, text="Request Summary", width=22)
        reqSumLbl.pack(side='left', padx=5, pady=5)

        # Check my changes here.
        self.reqSumBox = Entry(frame2, width=100, bg="White", fg="lightgrey", borderwidth=1)
        self.reqSumBox.insert(0, "Enter the Request Summary here")
        self.reqSumBox.pack(fill=X, padx=50, pady=5, expand=True)
        self.reqSumBox.bind("<Button-1>", self.clear_reqSumBox)

    # Changed the argument name to "event".
    def clear_reqSumBox(self, event):
        self.reqSumBox.delete(0, END)
        self.reqSumBox.config(fg="black")

def main():
    root = Tk()
    root.geometry("500x550+350+50")
    app = Example()

    root.mainloop()

if __name__ == '__main__':
    main()

Проверьте, где я комментирую, и проанализируйте этот код.

0 голосов
/ 11 июля 2020

Обратный вызов bind() требует аргумента, который является объектом события. Поэтому измените определение функции обратного вызова, как показано ниже:

def clear_reqSumBox(self, event):
    # get the widget triggering this event
    reqSumBox = event.widget
    reqSumBox.delete(0, END)
    reqSumBox.config(fg="black")
    # after that reqSumBox.get() will return empty string
    global SummaryText
    # SummaryText = "" will have same result of below line
    SummaryText = reqSumBox.get()

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

0 голосов
/ 11 июля 2020
reqSumBox.bind("<Button-1>", self.clear_reqSumBox)

При привязке любого события к функции он автоматически должен принимать параметр с именем event. Есть два способа исправить ваш код.

1.

reqSumBox.bind("<Button-1>", lambda event: self.clear_reqSumBox)

Сделать лямбда-функцию, которая принимает событие и вызывает функцию.

2.

def reqSumBox(self, reqSumBox, event=None)

Добавить необязательный параметр события в функцию reqSumBox.

Я лично использую первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...