2

我正在尝试设置我的程序框架。因此,目前还没有任何功能。我正在尝试使搜索标签下方的所有单选按钮整齐地跨 2 列格式化,以便它与上面的 2 列对齐。我将插入我的线框照片。我相信这可能是因为所有单选按钮没有足够的空间,但我不知道如何格式化列中的上述行来这样做。谢谢你

这是我的代码:

#Component 1 - create the rating frame

from tkinter import *
        
class MovieRaterGUI:

    def __init__(self, parent):

        #variable set up
        self.v = StringVar()
        self.v.set(" ")

        #titles
        self.movie_label = Label(text = "Please Rate:", borderwidth = 10)
        self.movie_label.grid(row = 0, column = 0, sticky = W)
        self.current_movie = Label(text = "The Hobbit", borderwidth = 10)
        self.current_movie.grid(row = 0, column = 1, sticky = W)
        self.rating_label = Label(text = "Your rating:", borderwidth = 10)
        self.rating_label.grid(row = 1, column = 0, sticky = W)

        self.search_label = Label(text = "Search for movies with a rating of:", borderwidth = 10)
        self.search_label.grid(row = 8, column = 0, columnspan = 2)

        
        movies = ["No Rating", "Forget it", "2", "3", "4", "Must See"]

        #making radiobuttons
        for i in range(len(movies)):
            options = Radiobutton(variable = self.v, value = i, text = movies[i], borderwidth = 10)
            options.grid(row = i+1, column = 1, sticky = W)

        for i in range(len(movies)):
            options = Radiobutton(variable = self.v, value = i, text = movies[i])
            options.grid(row = 9, column = i, columnspan = 2, sticky = W)
            i+=1
        

        next_btn = Button(parent, text = "Next", borderwidth = 10)
        next_btn.grid(row = 7, column = 1, sticky = W)

        previous_btn = Button(parent, text = "Previous", borderwidth = 10)
        previous_btn.grid(row = 7, column = 0, sticky = W)

        show_btn = Button(parent, text = "Show", borderwidth = 10)
        show_btn.grid(row = 10, column = 0, columnspan = 2)

if __name__ == "__main__":
    root = Tk()
    root.title("Movie Ratings")
    radiobuttons = MovieRaterGUI(root)
    root.mainloop()

这是输出:

在此处输入图像描述

这是我希望它看起来像的线框图:

在此处输入图像描述

另外,如果有人知道为什么我第一次显示这些单选按钮时第一个单选按钮上只有一个边框,那将不胜感激。:)

4

1 回答 1

1

不要试图把所有东西都强加到一个网格中。查看您的绘图,您的程序有两个清晰的部分:一个具有八行两列的上部,一个具有三行六列的底部。因此,首先创建一个带有两个框架的窗口,top并且bottom(或选择更好的名称......)

top = Frame(root)
bottom = Frame(root)

由于只有两个,并且它们应该填满窗口,pack因此将它们添加到窗口是最简单的选择:

top.pack(side="top", expand=True)
bottom.pack(side="bottom", expand=True)

注意:我选择pack了在调整窗口大小时使部分居中的选项。我不知道这是否是你想要的。

这样,您可以独立组织每个部分中的小部件。top尽管在创建小部件时需要作为第一个参数传递,但您可以保持代码的顶部大部分不变。我个人还发现,将grid语句组合在一起使代码更易于阅读,而不是grid在创建每个小部件后立即添加调用。

self.movie_label = Label(top, text = "Please Rate:", borderwidth = 10)
self.current_movie = Label(top, text = "The Hobbit", borderwidth = 10)
self.rating_label = Label(top, text = "Your rating:", borderwidth = 10)

self.movie_label.grid(row = 0, column = 0, sticky = W)
self.current_movie.grid(row = 0, column = 1, sticky = W)
self.rating_label.grid(row = 1, column = 0, sticky = W)

for i in range(len(movies)):
    options = Radiobutton(top, variable = self.v, value = i, text = movies[i], borderwidth = 10)
    options.grid(row = i+1, column = 1, sticky = W)

next_btn = Button(top, text = "Next", borderwidth = 10)
previous_btn = Button(top, text = "Previous", borderwidth = 10)

next_btn.grid(row = 7, column = 1, sticky = W)
previous_btn.grid(row = 7, column = 0, sticky = W)

然后,您可以使用网格做底部,但是这个网格独立于顶部的网格。

self.search_label = Label(bottom, text = "Search for movies with a rating of:", borderwidth = 10)
self.search_label.grid(row=0, column=0, columnspan=len(movies))
for i in range(len(movies)):
    options = Radiobutton(bottom, variable = self.v, value = i, text = movies[i])
    options.grid(row = 1, column = i, sticky = W)

show_btn = Button(bottom, text = "Show", borderwidth = 10)
show_btn.grid(row = 3, column = 0, columnspan = len(movies))

还有一些工作要做,因为当您调整它的大小时,窗口可能不会按照您想要的方式运行。我将把它作为练习留给你,因为不清楚你想要发生什么。无论如何,您可以分别为顶部和底部设置权重、最小尺寸、填充等。

截屏

于 2021-04-28T03:31:31.927 回答