Python 我的tkinter按钮坏了!什么都试过了

Python 我的tkinter按钮坏了!什么都试过了,python,button,tkinter,grid,toplevel,Python,Button,Tkinter,Grid,Toplevel,我想写一个游戏。到目前为止,我已经制作了一个按钮网格,但我似乎无法使按钮按我希望的方式工作。我认为问题在于x和y没有连接到实际的按钮,但我已经尝试了所有方法,但似乎无法使其工作。下面是我的最新尝试 import tkinter as tk jeopardy = tk.Tk() jeopardy.geometry("2000x1000") jeopardy.configure(background="blue") #------------Questions--------------- d

我想写一个游戏。到目前为止,我已经制作了一个按钮网格,但我似乎无法使按钮按我希望的方式工作。我认为问题在于x和y没有连接到实际的按钮,但我已经尝试了所有方法,但似乎无法使其工作。下面是我的最新尝试

import tkinter as tk

jeopardy = tk.Tk() 
jeopardy.geometry("2000x1000")
jeopardy.configure(background="blue")

#------------Questions---------------
def questions():
    global x
    global y
    global sort

    for sort in (x, y):

        if x == 0:
            if y == 0:   
                extra_window = tk.Toplevel(jeopardy)
                label2 = tk.Label(extra_window, text="question")
                label2.pack()

            elif y == 1:
                extra_window = tk.Toplevel(jeopardy)
                label3 = tk.Label(extra_window, text="question")
                label3.pack()

            #etc

#------------Buttongrid---------------
tk.Grid.rowconfigure(jeopardy, 0, weight=1)
tk.Grid.columnconfigure(jeopardy, 0, weight=1)

frame= tk.Frame(jeopardy)
frame.grid(row=0, column=0, sticky="nsew")

for x in range(5):
    tk.Grid.rowconfigure(frame, x, weight=1)
    for y in range(5):
        tk.Grid.columnconfigure(frame, y, weight=1)
        text = 100*(y+1)
        btn = tk.Button(frame, text=str(text), command=questions) 
        sort = btn.grid(column=x, row=y, sticky="nsew")



jeopardy.mainloop()

你有很多重复和无用的全局。可以使用lambda函数将参数传递给回调函数。我编辑了您的代码以演示它:

import tkinter as tk 

jeopardy = tk.Tk() 
jeopardy.geometry("1000x500")
jeopardy.configure(background="blue")

#------------Questions---------------
def questions(x, y):
    questiontext = f"question{x}{y}"

    extra_window = tk.Toplevel(jeopardy)
    lab = tk.Label(extra_window, text=questiontext)
    lab.pack()

#------------Buttongrid---------------
tk.Grid.rowconfigure(jeopardy, 0, weight=1)
tk.Grid.columnconfigure(jeopardy, 0, weight=1)

frame= tk.Frame(jeopardy)
frame.grid(row=0, column=0, sticky="nsew")

for x in range(5):
    tk.Grid.rowconfigure(frame, x, weight=1)
    for y in range(5):
        tk.Grid.columnconfigure(frame, y, weight=1)
        text = 100*(y+1)
        btn = tk.Button(frame, text=str(text), command=lambda x=x, y=y: questions(x, y))
        btn.grid(column=x, row=y, sticky="nsew")

jeopardy.mainloop()

λx=x,y=y:。。。避免x,y始终是@Herny Yik的评论所述循环的最后一个值。

我不知道您打算通过创建新的顶级窗口来做什么,但是当您在不依赖全局变量的情况下单击按钮时,以下内容将更改按钮文本:

import tkinter as tk

jeopardy = tk.Tk()
jeopardy.geometry("800x800")
jeopardy.configure(background="blue")

ROWS, COLS = 5, 5
# You'll want to populate this with real questions.
QUESTIONS = [['question {:2d}'.format(j*COLS+i) for i in range(1,COLS+1)]
                for j in range(ROWS)]


tk.Grid.rowconfigure(jeopardy, 0, weight=1)
tk.Grid.columnconfigure(jeopardy, 0, weight=1)

frame = tk.Frame(jeopardy)
frame.grid(row=0, column=0, sticky="nsew")

for x in range(ROWS):
    tk.Grid.rowconfigure(frame, x, weight=1)
    for y in range(COLS):
        tk.Grid.columnconfigure(frame, y, weight=1)
        text = 100*(y+1)
        btn = tk.Button(frame, text=str(text))
        btn.grid(column=x, row=y, sticky="nsew")

        def show_question(btn=btn, x=x, y=y):
            btn.config(text=QUESTIONS[x][y])

        btn.config(command=show_question)

jeopardy.mainloop()

不工作不是描述问题。到底是什么不起作用?@HenryYik:当单击按钮时会显示一个问题的按钮不起作用。@HenryYik单击按钮时顶层窗口不会打开。如果我在问号函数中指定x=0和y=0,它就会工作,这意味着顶层的代码是正确的。但是,我希望为坐标x、y和y 0到5显示一个新的顶级窗口,因此对于0、0、0、1等,x、y是for循环的最后一个赋值,始终为4、4。@HenryYik我明白了,是的,似乎是这样。有什么方法可以为我实际想要使用的坐标分配问题函数吗?