Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用tkinter未按要求显示布局_Python_Tkinter - Fatal编程技术网

Python 使用tkinter未按要求显示布局

Python 使用tkinter未按要求显示布局,python,tkinter,Python,Tkinter,我在python中使用tkinter,需要构建一个带有标签和按钮的简单GUI,如下所示: 但我面临两个问题。首先,我把按钮放在计时器的上方而不是下方。第二件事是我有一个按钮列表,这样就可以有更好的方法来代替将所有四个按钮的位置都显式地写出来 目前我的输出是: 我的代码是: from Tkinter import * import json import tkMessageBox class ProgramGUI(Frame): def __init__(self, master

我在python中使用tkinter,需要构建一个带有标签和按钮的简单GUI,如下所示:

但我面临两个问题。首先,我把按钮放在计时器的上方而不是下方。第二件事是我有一个按钮列表,这样就可以有更好的方法来代替将所有四个按钮的位置都显式地写出来

目前我的输出是:

我的代码是:

from Tkinter import *
import json
import tkMessageBox


class ProgramGUI(Frame):

    def __init__(self, master=None):
        master.title('QuizBox')
        master.update()
        master.minsize(350, 150)
        Frame.__init__(self, master)
        self.pack()
        questionText = StringVar()
        Label(master, textvariable=questionText,
              justify=CENTER, wraplength=200).pack()
        questionText.set("Question text goes here")

        timer = IntVar()
        Label(master, textvariable=timer, justify=CENTER, fg="blue").pack()
        timer.set("10")

        buttonList = []
        buttonList.append("Answer 1")
        buttonList.append("Answer 2")
        buttonList.append("Answer 3")
        buttonList.append("Answer 4")
        # ADD FOUR BUTTONS HORIZONTALLY

        self.columnconfigure(0, pad=3)
        self.columnconfigure(1, pad=3)
        self.columnconfigure(2, pad=3)
        self.columnconfigure(3, pad=3)
        self.rowconfigure(0, pad=3)
        answer1 = Button(self, text="Answer 1")
        answer1.grid(row=0, column=0)
        answer2 = Button(self, text="Answer 2")
        answer2.grid(row=0, column=1)
        answer3 = Button(self, text="Answer 3")
        answer3.grid(row=0, column=2)
        answer4 = Button(self, text="Answer 4")
        answer4.grid(row=0, column=3)

        score = IntVar()
        Label(master, textvariable=score, justify=CENTER).pack()
        score.set("Score: 0")


root = Tk()
gui = ProgramGUI(master=root)
gui.mainloop()
root.destroy()

快速修复方法是移动
self.pack()
,使其在按钮网格化之后,但在打包最终标签之前发生

    answer4.grid(row=0, column=3) 

    self.pack()

    score = IntVar()
现在,您的按钮将显示在计时器下方和分数上方

顺便说一句,您可以使用
for
循环来创建代码行较少的按钮

    timer.set("10")

    #ADD FOUR BUTTONS HORIZONTALLY
    buttonList = ["Answer 1", "Answer 2", "Answer 3", "Answer 4"]
    self.rowconfigure(0, pad=3)
    for i, value in enumerate(buttonList):
        self.columnconfigure(i, pad=3)
        Button(self, text=value).grid(row=0, column=i)

    self.pack()

如果您组织代码以反映UI的结构,那么解决方案将更容易可视化

当我查看您的设计时,我看到四行定义明确——问题、计时器、按钮行和分数。如果是我,我会为每一行创建一个单独的框架,并用pack将每一行堆叠在一起

我的假设是,问题是可能改变大小的一行,因为有些问题可能是短的,有些可能是长的

例如:

questionFrame = Frame(self, ...)
timerFrame = Frame(self, ...)
buttonFrame = Frame(self, ...)
scoreFrame = Frame(self, ...)

questionFrame.pack(side="top", fill="both", expand=True)
timerFrame.pack(side="top", fill="x")
buttonFrame.pack(side="top", fill="x")
scoreFrame.pack(side="top", fill="x")
class QuestionFrame(tk.Frame):
    <all the code to implement the question frame>
class ButtonFrame(tk.Frame):
    <all the code to implement the row of buttons>
...
questionFrame = QuestionFrame(...)
buttonFrame = ButtonFrame(...)
...
通过像这样组织代码,并将给定容器的所有
pack
语句分组在一起,可以更容易地可视化UI。一旦正确管理了这四个区域,就可以在每个帧内执行任何操作,而不会影响其他帧中发生的操作

您可以更进一步,创建一个类或函数来定义每个部分,这样就不会同时定义一大堆小部件。例如:

questionFrame = Frame(self, ...)
timerFrame = Frame(self, ...)
buttonFrame = Frame(self, ...)
scoreFrame = Frame(self, ...)

questionFrame.pack(side="top", fill="both", expand=True)
timerFrame.pack(side="top", fill="x")
buttonFrame.pack(side="top", fill="x")
scoreFrame.pack(side="top", fill="x")
class QuestionFrame(tk.Frame):
    <all the code to implement the question frame>
class ButtonFrame(tk.Frame):
    <all the code to implement the row of buttons>
...
questionFrame = QuestionFrame(...)
buttonFrame = ButtonFrame(...)
...
类问题框架(tk.Frame):
类按钮框架(tk.Frame):
...
questionFrame=questionFrame(…)
buttonFrame=buttonFrame(…)
...

UI的每个主要区域一个函数或一个类使代码更易于管理

现在假设我有一个名为modifyQuestion()的函数,想要修改包含questionText的标签文本,我该怎么做?每当我在score.set(“score:0”)之后调用modifyQuestion()时,我的程序就会崩溃。请帮助。您可能应该作为一个单独的问题来提问。我为其添加了新问题:)@BryanOaakley现在假设我有一个名为modifyQuestion()的函数,并且想要修改包含questionText的标签文本,我该怎么办?每当我在score.set(“score:0”)之后调用modifyQuestion()时,我的程序就会崩溃。请帮忙。