我试图根据列表创建一些复选框,但看起来好像我搞砸了命令调用和按钮的可变方面.
我的代码是:
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.courses = ["CSE 4444", "CSE 4343"]
self.vars = []
self.parent.title("Homework Helper")
self.course_buttons()
self.pack(fill=BOTH, expand=1)
def course_buttons(self):
x = 0
y = 0
for i in range(0, len(self.courses)):
self.vars.append(IntVar())
cb = Checkbutton(self, text=self.courses[i],
variable=self.vars[i],
command=lambda: self.onClick(i))
cb.select()
cb.grid(column=x, row=y)
y = y+1
def onClick(self, place):
print place
if self.vars[place].get() == 1:
print self.courses[place]
Run Code Online (Sandbox Code Playgroud)
到目前为止的测试是在复选框打开时在控制台上打印课程,但它仅适用于第二个按钮"CSE 4343"按钮.当我与按钮"CSE 4444"交互时,没有打印任何内容.
此外,"place"值onClick始终为1,无论我是单击按钮"CSE 4343"还是按钮"CSE 4444".
我不知道如何引用在 tkinter 中单击的按钮。
我的代码:
for file in files:
btn = Button(root, text=file).pack()
Run Code Online (Sandbox Code Playgroud)
现在例如 50 个按钮是从作为源的文件生成的。
但是,当我单击任何按钮时,只会引用最后一个按钮,而不是我真正想要使用/单击的按钮。
在 JavaScript 中,我们使用this引用我们真正点击的对象,但是我在 Python 中找不到任何解决方案。
我正在尝试实现一个名为“五连胜”的游戏。我创建了一个 15×15 的列表来放置按钮。(我使用 range(16) 因为我还想要一行和一列来显示行号和列号)
我希望我的实现就像一个按钮被点击时一样,它变成了一个标签。但我不知道用户点击了哪个按钮。
我怎样才能实现它?谢谢!
from tkinter import *
root=Tk()
root.wm_title("Five In a Row")
buttonlst=[ list(range(16)) for i in range(16)]
chess=Label(root,width=2,height=2,text='0')
def p(button):
gi=button.grid_info()
x=gi['row']
y=gi['column']
button.grid_forget()
chess.grid(row=x,column=y)
buttonlst[x][y]=chess
for i in range(16):
for j in range(16):
if i==0:
obj=Label(root,width=2,text=hex(j)[-1].upper())
elif j==0:
obj=Label(root,width=2,text=hex(i)[-1].upper())
else:
obj=Button(root,relief=FLAT,width=2,command=p(obj))
obj.grid(row=i,column=j)
buttonlst[i][j]=obj
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
有一个类似的问题如何确定哪个按钮被按下了 Python TKinter 中的按钮网格?. 但我不太明白。
我有以下代码可以在循环中创建一系列绑定:
from Tkinter import *
keys = {0:'m', 1:'n', 2:'o'}
def SomeFunc(event=None,number=11):
print keys[number], number
root = Tk()
field = Canvas(root, height = 200, width = 200, bg = "gray")
for i in range(2):
root.bind("<KeyPress-%c>" % keys[i],lambda ev:SomeFunc(ev,i))
field.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我按'm'或'n'时,函数SomeFunc以可变的'i'作为参数被调用。我希望在按“ m”时以0作为参数(使用“ bind”时使用数字“ i”),在按“ n”时以1作为参数来调用它。能做到吗?
我试图从列表形式存储的一组数据动态构建tkinter中的一些按钮.我无法解决的问题是如何在回调函数中添加一个参数.由于回调中的代码直到回调时才执行,因此回调中使用的变量此时已更改了值.
这是代码的(非常)简化版本:
from Tkinter import *
from ttk import *
mylist = ['a','b','c','d','e']
class App:
def __init__(self, master):
self.frame = Frame(master)
self.frame.pack()
for i in range (0,len(mylist)):
setattr(self, 'button' + str(i), Button(self.frame, text=mylist[i], command= lambda: self.buttoncall(i)))
getattr(self, 'button' + str(i)).pack(side=LEFT)
def buttoncall(self,input):
print mylist[input]
root = Tk()
app = App(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)