Python Tkinter 单击单选按钮会创建多个按钮



这些是我实际代码中的几行 - 我知道这不是编写代码的最佳方式,但由于我是新手并且熟悉 Tkinter (py2(,请考虑将其视为我的临时工作。

我列出了一个问题和多个选项。当用户选择一个选项时,将创建一个"提交"按钮,当单击"提交"按钮时,它将相应地将"选项"的颜色更改为绿色或红色。如果为绿色,则另一个 NEXT 按钮可用于清理并移至下一个问题。

我面临的问题是,如果用户选择选项 A,但随后没有单击"提交"按钮选择另一个选项,则提交按钮会成倍增加。我想销毁不需要的按钮,甚至不想创建多个提交按钮。 请帮助实现相同的目标。

import Tkinter
from Tkinter import *
import yaml
import random
grey = "#808080"
offwhite = "#e3e3e3"
filepath = "chapter-2.yaml"

tk = Tkinter.Tk()
tk.title("iCodet Learnings")
tk.geometry("800x600")
x = ''
tk.config(background=offwhite)
tk.resizable(0,0)
q_count = 0
def yaml_loader(filepath):
with open (filepath, "r") as fileread:
data = yaml.load(fileread)
return data
def cleaner(hint):
global rbutton
global q_count
global quest_label
global radio1
global button_game
quest_label.destroy()
radio1.destroy()
# destroys the radio buttons
for b in rbutton:
b.destroy()
# destroys the SUBMIT button
button_game.destroy()
# go to ext question
if hint == 'next':
q_count += 1
game_loop()

# This is display the first element from the yaml i.e the question
def display_question(questions, qc):
global quest_label
q = questions.keys()[qc]
a = questions[q]
v = a.keys()
quest_label = Label(tk, text = q, font = ("Consolas", 16), width = 500, justify = "center", wraplength = 400)
quest_label.pack(pady = (50,0))
return v
# This is for selecting the radio buttons
def selected():
global radio_default, button_next,radio1, val
global x, data,q_count, vali, rbutton, select_val
x = radio_default.get()
select_val =  rbutton[x]
if q_count <= len(data):
q = data.keys()[q_count]
a = data[q]  #second dictionary
v = a.keys() #second dictionary keys
# True or False from Yaml
val = a[v[x]][0]
press_button(val)
else:
print ("Mid way")
# This will list all the options under question
def display_answer(ans):
global radio1, rbutton
global x, q_count
global radio_default
radio_default = IntVar()
rbutton = []
rad_select = []
val_count = 0
for i in ans:
radio1 = Radiobutton(tk, text = i, font = ("times", 14, "bold"), value = val_count, variable = radio_default, command = selected, background = 'NavajoWhite3')
rbutton.append(radio1)
val_count += 1
radio1.pack(pady = (30,0))
radio_default.set(-1)
# This displays the SUBMIT buuton
def press_button(val):
global button_game
# true
if val:
button_game = Button(tk, text = 'SUBMIT', font = ("default", 15, "bold"), bg='orange', fg = 'white', border=2, height = 2, width = 8, command = lambda: cleaner('next'))
button_game.pack(pady = (30,0))
# false
elif not val:
print "Do nothing"
button_game = Button(tk, text = 'SUBMIT', font = ("default", 15, "bold"), bg='orange', fg = 'white', border=2, height = 2, width = 8, command = lambda: cleaner('stay'))
button_game.pack(pady = (30,0))
return True
def game_loop():
global q_count
global x, data
global quest_label, button_game
action = True
data = yaml_loader(filepath)
if q_count <= len(data)-1:
l_ans = display_question(data, q_count)
display_answer(l_ans)
else:
txt_label = Label(tk, text = "CONGRATULATIONS ON COMPLETING CHAPTER", font = ("Comicsans", 24, "bold"), background = offwhite, wraplength = 700)
txt_label.pack(pady = (100,0))
button_end = Button(tk, text = 'THANK YOU !', font = ("default", 15, "bold"), bg='saddle brown', fg = 'white', border=2, height = 3, width = 10, command = tk.destroy)
button_end.pack(pady = (50,0))
game_loop()
tk.mainloop()

第一章 亚姆

> "What’s the complete name of Sachin Tendulkar ?":
>                 "Sachin Ramya Tendulkar":
>                         - False
>                 "Sachin Ramesh Tendulkar":
>                         - True
>                 "Sachin Tendehar":
>                         - False
>                 " Sachin 10dulkar":
>                         - False
>                 "Hint":
>                         - "biscuit & cookies"

事实上,每次运行press_button()时,都会生成一个新的Button对象,并将其放置在button_game变量中。这不会删除或隐藏上一个按钮,该按钮仍存在于打包的 UI 中。

为机器节省一些工作的简单解决方案是仅在代码的前面初始化一次按钮,但省略放置/显示/打包它,直到运行press_button()中的块。

配置的帮助下,我能够实现我想要的东西。 我在开始时创建了一次 SUBMIT 按钮,然后而不是一次又一次地调用整个函数;我只是用button_game.config(command = lambda: right(chapter, num_ques, topic, val))替换了press_button

现在我应该使用 python 中的类编写此代码。

最新更新