我希望在tkinter中创建一个图块,每个角上都有文字,类似于这个图像:
_______
|a b|
|c_____d|
我还希望它具有单击时的功能,以运行命令功能。我目前的想法是创建一个框架,可以容纳四个文本标签,然后允许点击该框架。
import tkinter as tk
newFrame = tk.Frame()
newFrame.grid(row=0,column=0)
tk.Label(newFrame, text="a").grid(row=0,column=0)
tk.Label(newFrame, text="b").grid(row=0,column=1)
tk.Label(newFrame, text="c").grid(row=1,column=0)
tk.Label(newFrame, text="d").grid(row=1,column=1)
newFrame.config(command = makeFruity)
显然,最后一行不起作用。在网上搜索和阅读文档之后,我仍然完全不知道如何获得该框架来保存命令。所以,我正在与专家联系,如果有人能提供帮助,我会非常感激!
答案 0 :(得分:2)
您可以使用bind("<Button-1>", callback)
将点击分配给小部件。
您可能不仅要绑定到Frame
,还要绑定Labels
。
import tkinter as tk
def makeFruity(event):
print('makeFruity')
print('event:', event)
print('event.widget:', event.widget)
try:
print('event.widget.text:', event.widget.cget('text'))
except Exception as ex:
print('error:', ex)
root = tk.Tk()
newFrame = tk.Frame(root)
newFrame.grid(row=0, column=0)
# resize middle row and column
newFrame.columnconfigure(1, weight=1, minsize=100)
newFrame.rowconfigure(1, weight=1, minsize=100)
# use row/column 2 instead of 1
l1 = tk.Label(newFrame, text="a")
l1.grid(row=0,column=0)
l2 = tk.Label(newFrame, text="b")
l2.grid(row=0,column=2)
l3 = tk.Label(newFrame, text="c")
l3.grid(row=2,column=0)
l4 = tk.Label(newFrame, text="d")
l4.grid(row=2,column=2)
l1.bind('<Button-1>', makeFruity)
l2.bind('<Button-1>', makeFruity)
l3.bind('<Button-1>', makeFruity)
l4.bind('<Button-1>', makeFruity)
newFrame.bind('<Button-1>', makeFruity)
root.mainloop()
答案 1 :(得分:0)
像这样:
from Tkinter import *
root = Tk()
root.geometry("400x400+50+50")
elements = {}
def getElemVarName(name):
print "You clicked :%s element in ELEMENTS dict" %name
def Move(e):
key = e.keysym
for i in elements.keys() :
X,Y= int(elements[i].place_info()["x"]),int(elements[i].place_info()["y"])
if key == "Up" :
elements[i].place_configure(x=X, y=Y-1 )
elif key == "Down" :
elements[i].place_configure(x=X, y=Y+1 )
elif key == "Left" :
elements[i].place_configure(x=X-1, y=Y)
elif key == "Right" :
elements[i].place_configure(x=X+1, y=Y)
elements[i].config(text="%d-%d"%(X,Y))
for i in range(4):
pos = divmod(i,2)
lb = Label(root,text=str(i))
lb.place(x=pos[1]*50+10,y=(pos[0]*50)+10)
elements["%d"%i] = lb
for eve in ('<Left>','<Right>','<Up>','<Down>') :
root.bind(eve, Move)
for i in elements.keys() :
elements[i].bind('<Button-1>', lambda event,s=i:getElemVarName(s))
root.mainloop()
所以:
4个元素的for i in range(4):
pos = divmod(i,2)
设置网格值
lb = Label(root)
创建标签
lb.place(x=pos[1]*50+10,y=(pos[0]*50)+10)
意思是:pos[1]*50+10
; pos[1]
XGrid_Position,*50
xGrid_Size,+10
偏移量(y
值上的相同模式)
如果更改项目文字,则无法按文字搜索。
按下键盘箭头键以显示正在发生的事情。(PY2.7)仅使用一种定位方法(包,网格,位置)(如果您使用复杂的GUI,{{1}的方法}可以实现其他方法的功能。)
评论后:
place
使用 lambda 函数将传递的变量名称作为字符串!