如何使用类似按钮的功能创建Python tkinter框架?

时间:2018-01-08 04:26:26

标签: python tkinter

我希望在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)

显然,最后一行不起作用。在网上搜索和阅读文档之后,我仍然完全不知道如何获得该框架来保存命令。所以,我正在与专家联系,如果有人能提供帮助,我会非常感激!

2 个答案:

答案 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 函数将传递的变量名称作为字符串!