条目没有正确响应按钮'在python中绑定

时间:2015-08-09 08:37:11

标签: python tkinter calculator tkinter-entry

我试图在python中编写一个计算器一段时间了,我的输入存在问题我无法解决它,尽管我没有看到任何问题。

所以这是我的代码的一个例子:

from Tkinter import *

window =Tk()
window.title("Calculator")
#creating an entry
string=StringVar
entry = Entry(window, width=40,textvariable=string )
entry.grid(row=0, column=0, columnspan=6, ipady=10)
entry.focus()


#basically I have a function for creating buttons but here I will do it the traditional way.

num_one=Button(window,text="1",width=2,height=2,padx=20,pady=20,)
num_one.grid(row=1,column=0,padx=1,pady=1)

#crating an index for the calculator
index=0
#creating a function to insert the number one to the entry in the index position and then add one to the index

def print_one(index):
    entry.insert(index,"1")

binding the num_one button to the function above

num_one.bind("Button-1",print_one(index))

现在的问题是字符串" 1"只有当我点击num_one按钮时,才应输入该条目,但是当我自动启动程序时,数字" 1"进入条目。

2 个答案:

答案 0 :(得分:2)

我在代码中发现了很多问题 -

  1. string=StringVar - 你需要像StringVar()一样调用它,否则你只是将StringVar类(不是它的对象)设置为`string。

  2. 当你这样做时 -

    num_one.bind("Button-1",print_one(index))
    

    你实际上先调用函数并绑定返回值,你应该绑定函数对象(不调用它),例如 -

    num_one.bind("<Button-1>",print_one)
    
  3. 要将功能绑定到鼠标左键,您需要绑定到<Button-1>(注意末端的<>)而不是Button-1

  4. 在您的函数中,您将收到的第一个参数(绑定的函数)是事件对象,而不是下一个索引。你可以改用 -

    string.set(string.get() + "1")
    

答案 1 :(得分:2)

正如Anand所说,你的当前代码存在各种问题,无论是在语法和语法方面。设计。

我不确定你为什么要自己跟踪Entry的索引,因为Entry小部件已经这样做了。要在当前光标位置插入文字,您可以在Tkinter.INSERT方法调用中使用entry.insert()

看起来您打算为每个数字按钮编写单独的回调函数。这是不必要的,它可能会变得混乱。

下面的代码显示了为多个按钮使用单个回调函数的方法。我们将按钮的编号作为属性附加到按钮本身。回调函数可以轻松访问该数字,因为调用回调的Event对象参数包含将其激活为属性的小部件。

请注意,我的代码使用import Tkinter as tk而不是from Tkinter import *。当然,它使代码更加冗长,但它可以防止名称冲突。

import Tkinter as tk

window = tk.Tk()
window.title("Calculator")

entry_string = tk.StringVar()
entry = tk.Entry(window, width=40, textvariable=entry_string)
entry.grid(row=0, column=0, columnspan=6, ipady=10)
entry.focus()

def button_cb(event):
    entry.insert(tk.INSERT, event.widget.number)

for i in range(10):
    y, x = divmod(9 - i, 3)
    b = tk.Button(window, text=i, width=2, height=2, padx=20, pady=20)
    b.grid(row=1+y, column=2-x, padx=1, pady=1)
    #Save this button's number so it can be accessed in the callback
    b.number = i
    b.bind("<Button-1>", button_cb)

window.mainloop()

理想情况下,GUI代码应该进入一个类,因为这使得小部件更容易共享数据,并且它往往使代码更整洁。