мои кнопки в ткинтере не работают!перепробовал все - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь написать игру.Пока что я создал сетку кнопок, но я не могу заставить кнопки работать так, как я хочу.Я думаю, что проблема заключается в том, что 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()

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Я не знаю, что вы планировали сделать, создав новые окна Toplevel, но следующее изменит текст Button s при нажатии на них (без использования глобальных переменных):

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()
1 голос
/ 09 марта 2019

У вас много повторений и бесполезно globals.Вы можете использовать функции 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()

lambda x=x , y=y : ... избегает x, y всегда являясь последними значениями цикла, указанного в комментарии @Herny Yik.

...