如何在 tkinter 中打印文本框的内容?

时间:2021-07-22 18:41:31

标签: python tkinter

import tkinter as tk

class Calculator(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)
        self.master.geometry("1000x1000")
        self.master.title("GUI Calculator")
        self.pack()
        self.x = 0
        self.button1 = tk.Button(text = "1", fg = "Blue", bg = "Black", command = self.func1)
        self.button1.pack()
        self.button2 = tk.Button(text="2", fg="Red", bg="Black", command = self.func2)
        self.button2.pack()
        self.button3 = tk.Button(text="3", fg="Green", bg="Black", command = self.func3)
        self.button3.pack()
        self.button4 = tk.Button(text="4", fg="Red", bg="Black", command = self.func4)
        self.button4.pack()
        self.button5 = tk.Button(text="5", fg="Green", bg="Black", command = self.func5)
        self.button5.pack()
        self.button6 = tk.Button(text="6", fg="Blue", bg="Black", command = self.func6)
        self.button6.pack()
        self.button7 = tk.Button(text="7", fg="Red", bg="Black", command = self.func7)
        self.button7.pack()
        self.button8 = tk.Button(text="8", fg="Green", bg="Black", command = self.func8)
        self.button8.pack()
        self.button9 = tk.Button(text="9", fg="Blue", bg="Black", command = self.func9)
        self.button9.pack()
        self.text = tk.Text(master)
        self.text.bind("<Key-Return>", self.calculation())
        self.text.pack()
        self.master.mainloop()
    def calculation(self):
        
    def func1(self):
        var1 = 1
        self.text.insert(tk.END, var1)
        self.text.pack()
    def func2(self):
        var2 = 2
        self.text.insert(tk.END, var2)
        self.text.pack()
    def func3(self):
        var3 = 3
        self.text.insert(tk.END, var3)
        self.text.pack()
    def func4(self):
        var4 = 4
        self.text.insert(tk.END, var4)
        self.text.pack()
    def func5(self):
        var5 = 5
        self.text.insert(tk.END, var5)
        self.text.pack()
    def func6(self):
        var6 = 6
        self.text.insert(tk.END, var6)
        self.text.pack()
    def func7(self):
        var7 = 7
        self.text.insert(tk.END, var7)
        self.text.pack()
    def func8(self):
        var8 = 8
        self.text.insert(tk.END, var8)
        self.text.pack()
    def func9(self):
        var9 = 9
        self.text.insert(tk.END, var9)
        self.text.pack()
if __name__ == "__main__":
    Calculator()

我正在构建一个计算器并希望根据用户在文本框中输入的内容执行计算。但首先,我必须检测文本框中的内容。因此,在按下“输入”键时,我希望它打印文本框的内容。我不知道该怎么做。

我大约两天前刚刚开始这个项目,但我被卡住了,所以我想我可以询问堆栈溢出。谢谢!

2 个答案:

答案 0 :(得分:2)

我认为@Matiiss 在其他方面出色的 answer 在描述如何创建 Button 方面相当不够。每当您发现自己编写了大量类似的重复代码时,通常强烈 表明您可能有更好的做事方式。请参阅有关重要的 DRY (Don't Repeat Yourself) 软件开发原则的维基百科文章。

在这种情况下,考虑到所有那些几乎相同的 Button 回调函数(func1()func2() 等……),您为它们中的每一个都拥有了双重功能。解决方案是在单个 for 循环中进行。

下面的代码说明了如何做到这一点(并且还有@Matiiss 的其他更改)。请注意它与您的相比的简洁性。我已经用 # ALL CAP COMMENTS 指出了最显着的变化。

import tkinter as tk

class Calculator(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master.geometry("1000x1000")
        self.master.title("GUI Calculator")
        self.pack()
        self.x = 0

        # CREATE BUTTONS IN A FOR LOOP.
        btnclrs = ("Blue", "Red", "Green", "Red", "Green", "Blue", "Red", "Green", "Blue")
        self.btns = []
        for i, color in enumerate(btnclrs, start=1):
            def funcN(self=self, value=i):
                self.text.insert(tk.END, value)

            button = tk.Button(text=i, fg=color, bg="Black", command=funcN)
            button.pack()
            self.btns.append(button)

        self.text = tk.Text(self.master)
        self.text.bind("<Key-Return>", self.calculation)  # DON'T CALL FUNCTION WHEN BINDING.
        self.text.pack()
        self.text.focus_set()  # ADDED SO BOUND EVENT-HANDLERS WILL BE CALLED.
        self.master.mainloop()

    def calculation(self, event):  # ADDED event ARGUMENT.
        print(self.text.get('1.0', 'end'))


if __name__ == "__main__":
    Calculator()

答案 1 :(得分:1)

好的,首先是关于绑定,它应该是这样的:

self.text.bind("<Return>", self.calculation)

def calculation(event=None):
    print(self.text.get('1.0', 'end'))

现在应该在按下回车/回车键时将文本小部件的所有内容打印到终端

现在建议,首先我建议只有这样一种方法:

def insert_num(self, number):
    self.text.insert('end', number)

然后像这样分配给每个按钮:

btn1 = Button(master, text='1', command=lambda: self.insert_num(1))

因此对于每个按钮,只需更改数字,您只需要一种方法(我也可以建议在循环中创建按钮,但是......现在应该足够了)

编辑:您显然可以使用 tkinter 常量进行索引,就像您已经使用过的 tk.END

相关问题