python中bind的用法_Python 2.7:Tkinter,如何使用bind方法?

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.

Here is my code :

#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("",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)

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.

So here is my question :

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.

e.g.

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("",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("",lambda e: change_label("Horse"))

lbl.bind("",lambda e: change_label("Cow"))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值