Python 2.7:Tkinter,如何使用bind方法? [英] Python 2.7 : Tkinter, How to use the bind method?

查看:632
本文介绍了Python 2.7:Tkinter,如何使用bind方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Python创建Scrabble游戏.我想显示当用户键入单词时该单词值得的分数. 我已经问了这个问题,因为我不知道使用哪种方法.当我发现要使用哪种方法,而我的问题是如何使用此方法时,我认为这值得一个新的问题. 我的问题是我创建了一个名为bind_entry(event)的函数,该函数应该在用户每次输入字母时设置标签.但是函数bind_entry(event)不知道要设置的标签和单词所在的条目.

I'm trying to create a Scrabble game with Python. I'd like to display the points that the word worth when the user is typing the word. I already asked this question as I didn't know what method to use. As I discovered which method to use, and my question is about how to use this method, I think this deserve a new question. My problem is that I created a function called bind_entry(event) that is supposed to set a label every time the user type a letter. But the function bind_entry(event)doesn't know the label to set and the entry where the word is.

这是我的代码:

#this the function creating the label
def create_variabletext_intlabel(root,col,row):
    val=IntVar()
    label=Label(root,textvariable=val)
    label.grid(column=col,row=row)
    return val, label

#this is the function creating the entry
def create_entry_string(root,width,col,row,columnspan,rowspan):
    val=StringVar()
    entry=ttk.Entry(root,width=width,textvariable=val)
    entry.grid(column=col,row=row,columnspan=columnspan,rowspan=rowspan)
    entry.bind("<Any-KeyPress>",bind_entry)
    #Here is my problem, when I call the function bind_entry.
    return val, entry

def bind_entry(event):
    label.set(m.counting_point(char(event))) 
    # m.counting_point() is a function counting the word's points
    # my problem is that the function doesn't know yet the label. 
    # I don't know how to call the label. 

# I call the function create_entry_string in another file initiating
# all the widget for the GUI
val_entry_word, entry_word =g.create_entry_string(root,15,1,1,1,1)

# I call the function create_variabletext_intlabel in another file
# initiating all the widget for the GUI
val_points,label_points=g.create_variabletext_intlabel(root,1,2)

我刚刚注意到,函数m.counting_points()将仅计算用户键入的字母.在这里,我应该打电话给val_entry_word.

I just noticed that the function m.counting_points() will count only the letter that is typed by the user. Here I should call val_entry_word.

这是我的问题:

由于val_entry_wordval_points是在另一个文件的函数中创建的,我该如何在函数bind_entry()中调用val_entry_wordval_points?

As val_entry_word and val_points are created in a function in another file How could I call val_entry_word and val_points in the function bind_entry() ?

推荐答案

通常,当您需要不同的函数调用来共享信息而不显式传递信息时,最佳实践是使用类.

Generally, when you need different function calls to share information without passing it explicitly, the best practice is to use a class.

例如

class LabelUpdater(object):
    def create_variabletext_intlabel(self,root,col,row):
        val=IntVar()
        self.label=label=Label(root,textvariable=val)
        label.grid(column=col,row=row)
        return val, label

    #this is the function creating the entry
    def create_entry_string(self,root,width,col,row,columnspan,rowspan):
        val=StringVar()
        entry=ttk.Entry(root,width=width,textvariable=val)
        entry.grid(column=col,row=row,columnspan=columnspan,rowspan=rowspan)
        entry.bind("<Any-KeyPress>",self.bind_entry)
        #Here is my problem, when I call the function bind_entry.
        return val, entry

     def bind_entry(self,event):
        self.label.set(m.counting_point(char(event))) 

#At this point, I don't understand your code anymore since I don't know what g
#is or how it's create_entry_string method calls your create_entry_string function...
#I'll assume that the module where g's class is defined imports this file...
#If that's how it works, then the following may be ok, although probably not because
#of circular imports...

container=LabelUpdater()
create_variabletext_intlabel=container.create_variabletext_intlabel
create_entry_string=container.create_entry_string

val_entry_word, entry_word =g.create_entry_string(root,15,1,1,1,1) #somehow calls create_variabletext_intlabel which is mapped to container.create_variable_intlabel???

# I call the function create_variabletext_intlabel in another file
# initiating all the widget for the GUI
val_points,label_points=g.create_variabletext_intlabel(root,1,2)

当然,您也可以使用全局变量...(尽管绝对不建议这样做)

Of course, you could also use globals...(though that is definitely discouraged)

最后,我经常在绑定回调中添加其他信息的惯用法是将回调函数包装在另一个函数中...

Finally, an idiom that I often use to add additional information in a bind callback is to wrap the callback function in another function...

def myfunc(root):
    label=Label(root,text="cow")
    label.pack()
    return label

#This is the callback we want...
#  Q: but how do we pass S? 
#  A: we need to wrap this call in another -- a perfect use for lambda functions!
def change_label(label,S):
    label.config(text=S)

root=Tk()
lbl=myfunc(root)
lbl.bind("<Enter>",lambda e: change_label("Horse"))
lbl.bind("<Leave>",lambda e: change_label("Cow"))        

这篇关于Python 2.7:Tkinter,如何使用bind方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆