簡體   English   中英

為什么tk鍵綁定在這里不起作用?

[英]Why is the tk key binding not working here?

這是代碼:

#!/usr/bin/env python3
################################################################
### Solve the unknown
################################################################
class App:
    def __init__(self, root):
        self.fields = ["A", "B", "AB"]
        self.root = root
        self.entries = []
        self.numerics = []
        self.makeRows()
        Button(self.root, text="Run", command=self.run).grid(row=3, column=0)
        Button(self.root, text="Reset", command=self.reset).grid(row=3, column=1)
        root.bind("<Return>", self.run)
        root.bind("<space>", self.reset)

    def makeRows(self):
        for i in range(len(self.fields)):
            label = Label(self.root, text=self.fields[i], justify=LEFT)
            entry = Entry(self.root)
            label.grid(row=i, sticky=W)
            entry.grid(row=i, column=1)
            self.entries.append(entry)

    def getValues(self):
        try:
            values = [e.get() for e in self.entries]
            self.numerics = [float(v) if v!="" else v for v in values]
            print(self.numerics)
        except ValueError:
            messagebox.showerror(title="Error", message="Input only numerical values!")
            self.numerics = []

    def checkEmpty(self, elem):
        if elem == "":
            return 1
        else:
            return 0

    def checkEmptyInEntries(self):
        if len(self.numerics) != 0:
            entry_emptiness = [self.checkEmpty(v) for v in self.numerics]
            if sum(entry_emptiness) != 1:
                messagebox.showerror(title="Error", message="Leave one and only one entry empty!")
                return None
            return entry_emptiness
        else:
            return None

    def run(self):
        self.getValues()
        emptiness = self.checkEmptyInEntries()
        if emptiness == None:
            return None
        empty_index = emptiness.index(1)
        if empty_index == 0:
            self.entries[0].delete(0, END)
            self.entries[0].insert(0, str(self.numerics[2] / self.numerics[1]))
        elif empty_index == 1:
            self.entries[1].delete(0, END)
            self.entries[1].insert(0, str(self.numerics[2] / self.numerics[0]))
        else:
            self.entries[2].delete(0, END)
            self.entries[2].insert(0, str(self.numerics[0] * self.numerics[1]))

    def reset(self):
        for entry in self.entries:
            entry.delete(0, END)


from tkinter import *
root = Tk()
app = App(root)
root.mainloop()

按鈕工作正常,但是每當我按Enter時,Python都會抱怨:

TypeError: run() takes 1 positional argument but 2 were given

使用bind將事件bind到回調時,每次調用綁定時,都會將事件對象發送到回調。 您需要處理這個額外的參數。 最簡單的方法是使用lambda函數:

root.bind("<Return>", lambda _: self.run())

在上面的代碼中, _將是事件對象。

請注意,您還可以更改run的定義以接受此對象:

def run(self, event):

但是我個人更喜歡lambda因為它使run不使用事件對象更加清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM