【发布时间】:2018-03-02 01:36:14
【问题描述】:
启动游戏时按钮的顺序是随机的(由函数引起),但是当我继续按“正确”按钮时,按钮的位置在加载屏幕后不会更新;即使他们的文字更新。即使 randomPosition 函数更改了每个按钮的位置,按钮的位置也不会更新。 有什么方法可以更新按钮的位置,使“正确”的按钮在加载屏幕后不在同一个位置?
import tkinter as tk
from tkinter import StringVar
from tkinter import *
from random import randint
f1 = ("MS Serif", 29)
lives = 3
multiplier = 0
levelCounter = 1
answer2Counter = 0
answer3Counter = 1
answer4Counter = 2
def randomPosition(): #PLACES THE BUTTONS IN RANDOM VARIETY EACH TIME GAME IS OPEN
global xpos1, xpos2, ypos3, ypos4, random
random = randint(1,4)
print("Random Integer Position: " + str(random))
#CO-ORDINATES FOR BUTTON PLACEMENT
if random == 1:
xpos1 = 50
xpos2 = 730
ypos3 = 610
ypos4 = 720
elif random == 2:
xpos1 = 730
xpos2 = 50
ypos3 = 610
ypos4 = 720
elif random == 3:
xpos1 = 50
xpos2 = 730
ypos3 = 720
ypos4 = 610
elif random == 4:
xpos1 = 730
xpos2 = 50
ypos3 = 720
ypos4 = 610
randomPosition()
BtnWidth = 20
def wrong(self, controller):
global lives
lives -= 1
print("Lives: " + str(lives))
if lives == 0:
app.destroy()
def correct(self, controller):
global multiplier, levelCounter
multiplier += 1
levelCounter += 1
answer1.set(ftvArray[levelCounter])
answer2.set(wrongFtvArray[multiplier][answer2Counter]) #READS 1ST VALUE OF ARRAY
answer3.set(wrongFtvArray[multiplier][answer3Counter]) #READS 2ND VALUE OF ARRAY
answer4.set(wrongFtvArray[multiplier][answer4Counter]) #READS 3RD VALUE OF ARRAY
ftvArray = ['CORRECT', 'CORRECT', 'CORRECT', 'CORRECT', 'CORRECT', 'CORRECT', 'CORRECT', 'CORRECT', 'CORRECT', 'CORRECT']
wrongFtvArray = [['WRONG', 'WRONG', 'WRONG'], ['WRONG', 'WRONG', 'WRONG'], ['WRONG', 'WRONG', 'WRONG'], ['WRONG', 'WRONG', 'WRONG'], ['WRONG', 'WRONG', 'WRONG']] #'WRONG' IS A PLACEHOLDER VALUE
class Game(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side = "top", fill = "both", expand = True)
container.grid_rowconfigure(0, weight = 1)
container.grid_columnconfigure(0, weight = 1)
self.frame = {}
for F in (FilmTV, LoadingScreen):
frame = F(container, self)
self.frame[F] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(FilmTV)
def show_frame(self, cont):
frame = self.frame[cont]
frame.tkraise()
class FilmTV(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
global answer1, answer2, answer3, answer4
answer1 = StringVar()
answer1.set(ftvArray[levelCounter])
answer2 = StringVar()
answer2.set(wrongFtvArray[multiplier][answer2Counter])
answer3 = StringVar()
answer3.set(wrongFtvArray[multiplier][answer3Counter])
answer4 = StringVar()
answer4.set(wrongFtvArray[multiplier][answer4Counter])
#ANSWERS
Btn = tk.Button(self, textvariable = answer1, command = lambda:[correct(self, controller), loading(self, controller), randomPosition()], font = f1, width = BtnWidth).place(x = xpos1, y = ypos3)
Btn2 = tk.Button(self, textvariable = answer2, command = lambda:[wrong(self, controller)], font = f1, width = BtnWidth).place(x = xpos1, y = ypos4)
Btn3 = tk.Button(self, textvariable = answer3, command = lambda:[wrong(self, controller)], font = f1, width = BtnWidth).place(x = xpos2, y = ypos3)
Btn4 = tk.Button(self, textvariable = answer4, command = lambda:[wrong(self, controller)], font = f1, width = BtnWidth).place(x = xpos2, y = ypos4)
def loading(self, controller):
self.controller.show_frame(LoadingScreen)
app.after(1500, nextLevel)
def nextLevel():
self.controller.show_frame(FilmTV)
class LoadingScreen(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
LoadingLbl = tk.Label(self, text = 'CORRECT ANSWER! LOADING...', font = f1).place(x = 50, y = 50)
app = Game()
app.geometry("1260x830+150+5")
app.mainloop()
【问题讨论】:
-
您想在放置按钮后更改按钮位置?您需要忘记按钮然后替换它。
-
我的第一个建议是不要试图在 lambda 中塞进太多东西。使用真正的函数,它会让你的代码调试变得非常容易。
-
@T4rk1n:你不需要先忘记按钮。
-
@HJC:当然有可能。每当您在一个小部件上的所有
pack、place或grid时,它都拥有该小部件,从而使之前对pack、place或grid的任何调用无效。 -
只需致电
place。你似乎已经知道该怎么做。尝试一下。尝试一下。
标签: python python-3.x button tkinter