我确定我错过了一些简单的东西,但这一直在吞噬我。我正在尝试创建“答案字段”并根据下拉列表销毁它们。我可以将我的小部件设置得很好但是当我尝试调用我的销毁功能时,它不会产生错误或破坏任何东西。
当你在下拉菜单上点击“2”时,我会得到两个字段。当我点击“1”字段时,“B”应该消失。
不确定我做错了什么
这是我的代码:
import sys
from tkinter import *
from tkinter import messagebox
import winsound
testbuilder = Tk()
testbuilder.geometry('1000x400')
testbuilder.title('Input your questions and answers.')
class add_remove_answer_fields:
def __init__(self, master, textbox_yheight, textbox_xwidth, letter_text):
self.text_box = Text(master, height = textbox_yheight, width = textbox_xwidth)
self.letter = Label(master, text = letter_text)
def place_field(self, textbox_xpos,textbox_ypos,letter_xpos,letter_ypos):
self.text_box.place(x=textbox_xpos, y=textbox_ypos)
self.letter.place(x=letter_xpos, y=letter_ypos)
def destroy_answer(self):
self.text_box.destroy()
self.letter.destroy()
def buildanswers(answer):
aentry = add_remove_answer_fields(testbuilder, 2, 50, "A.")
bentry = add_remove_answer_fields(testbuilder, 2, 50, "B.")
if answer == "1":
aentry.place_field(500, 31, 480, 40)
bentry.destroy_answer()
if answer == "2":
aentry.place_field(500, 31, 480, 40)
bentry.place_field(500, 72, 480, 81)
# if answer == "3":
# if answer == "4":
# if answer == "5":
# if answer == "6":
# if answer == "7":
#picking amount of answers to show up
answer_amount = IntVar(testbuilder)
answer_amount_dropdown = OptionMenu(testbuilder, answer_amount, "1", "2", command = buildanswers)
answer_amount_dropdown.place (x = 20, y = 220)
# Question and answer fields
questionlabel = Label(testbuilder, text="Question")
questionlabel.place(x=1, y=1)
qentry = Text(testbuilder, height=10, width=50)
qentry.place(x=1, y=31)
answerlabel = Label(testbuilder, text="Answers")
answerlabel.place(x=500, y=1)
testbuilder.mainloop()
更新
朗诺里斯很好地回答了这个问题。以下是我认为执行上述代码的正确方法:import sys
from tkinter import *
from tkinter import messagebox
import winsound
testbuilder = Tk()
testbuilder.geometry('1000x400')
testbuilder.title('Input your questions and answers.')
class add_remove_answer_fields:
def __init__(self, master, textbox_yheight, textbox_xwidth, letter_text):
self.text_box = Text(master, height = textbox_yheight, width = textbox_xwidth)
self.letter = Label(master, text = letter_text)
def place_field(self, textbox_xpos,textbox_ypos,letter_xpos,letter_ypos):
self.text_box.place(x=textbox_xpos, y=textbox_ypos)
self.letter.place(x=letter_xpos, y=letter_ypos)
def forget_answer(self):
self.text_box.place_forget()
self.letter.place_forget()
def buildanswers(answer):
if answer == '1':
aentry.place_field(500, 31, 480, 40)
print(len(testbuilder.winfo_children()))
bentry.forget_answer()
if answer == "2":
aentry.place_field(500, 31, 480, 40)
bentry.place_field(500, 72, 480, 81)
print(len(testbuilder.winfo_children()))
# if answer == "3":
# if answer == "4":
# if answer == "5":
# if answer == "6":
# if answer == "7":
aentry = add_remove_answer_fields(testbuilder, 2, 50, "A.")
bentry = add_remove_answer_fields(testbuilder, 2, 50, "B.")
#picking amount of answers to show up
answer_amount = IntVar(testbuilder)
answer_amount_dropdown = OptionMenu(testbuilder, answer_amount, "1", "2", command = buildanswers)
answer_amount_dropdown.place (x = 20, y = 220)
# Question and answer fields
questionlabel = Label(testbuilder, text="Question")
questionlabel.place(x=1, y=1)
qentry = Text(testbuilder, height=10, width=50)
qentry.place(x=1, y=31)
answerlabel = Label(testbuilder, text="Answers")
answerlabel.place(x=500, y=1)
testbuilder.mainloop()
答案 0 :(得分:3)
正在发生的事情是你将小部件堆叠在一起。这样你就可以拥有2个'B'小部件。您删除了刚刚创建的那个,但另一个(从下拉列表中选择“2”)仍然存在。您可以通过将此print语句放在answer 1 test:
中来观察这一点if answer == '1':
aentry.place_field(500, 31, 480, 40)
print(len(testbuilder.winfo_children()))
bentry.destroy_answer()
每次选择“1”时,窗口小部件的数量会增加,但它们会叠加在一起,因此您无法看到它们。您可能应该在需要时创建小部件,而不是创建一堆并在之后丢弃。