繁体   English   中英

Tkinter:使用网格列的框架中小部件的不规则间距

[英]Tkinter: Irregular spacing for widgets in frames using grid columns

我试图在 Tkinter 中创建一个相对简单的调查,如表单,我对 GUI 框架比较陌生。 我在试图弄清楚为什么会有如此多的不一致时遇到了真正的问题,尤其是在使用同一行中的网格放置+框架+多个小部件时。 尤其是这个具体的例子。 我把我所有的问题都放在了一个框架里,似乎解决了......有点一半。 尽管行似乎很好地配合,但列是整个事情爆发的地方。

qframe1 = Frame(question, bg='black')
qframe1.grid(row=1, padx = 20, sticky = W)

q1l = Label(qframe1, text = 'Question 1: How often do you eat at Mcdonalds?', font = ('Calibri', 14), bg = 'azure')
q1l.grid(columnspan = 4, pady = 5, sticky = W)
q1 = StringVar()
q1.set('None')
q1r1 = Radiobutton(qframe1, text = 'Everyday!', font = ('Calibri', 12), bg = 'azure', variable = q1, value = 'Always')
q1r1.grid(row=1, column = 0, pady = 5, sticky = W)
q1r2 = Radiobutton(qframe1, text = 'Sometimes', font = ('Calibri', 12), bg = 'azure', variable = q1, value = 'Sometimes')
q1r2.grid(row=1, column = 1, pady = 5, sticky = W)
q1r3 = Radiobutton(qframe1, text = 'Not Frequently', font = ('Calibri', 12), bg = 'azure', variable = q1, value = 'Infrequent')
q1r3.grid(row=1, column = 2, pady = 5, sticky = W)
q1r4 = Radiobutton(qframe1, text = 'Never', font = ('Calibri', 12), bg = 'azure', variable = q1, value = 'Never')
q1r4.grid(row=1, column = 3, pady = 5, sticky = W)

这是混乱部分的裸代码。
在此处输入图片说明

此外,我已确保不是每个单选按钮的长度导致问题。 当我更改单选按钮的文本时,它们仍然被放置在相同的不规则位置。

这是琐事另一部分的代码。

q2l = Label(qframe1, text = 'Question 2: What meal do you normally order?', font = ('Calibri', 14), bg = 'azure')
q2l.grid(row=2, columnspan = 4, pady = 5, sticky = W)
q2 = StringVar()
q2.set('None')
q2r1 = Radiobutton(qframe1, text = 'Fries', font = ('Calibri', 12), bg = 'azure', variable = q2, value = 'Fries')
q2r1.grid(row=3, column = 0, pady = 5, sticky = W)
q2r2 = Radiobutton(qframe1, text = 'Hamburgers', font = ('Calibri', 12), bg = 'azure', variable = q2, value = 'Hamburgers')
q2r2.grid(row=3, column = 1, pady = 5, sticky = W)
q2r3 = Radiobutton(qframe1, text = 'Chicken Nuggets', font = ('Calibri', 12), bg = 'azure', variable = q2, value = 'Chicken Nuggets')
q2r3.grid(row=3, column = 2, pady = 5, sticky = W)
q2r4 = Radiobutton(qframe1, text = 'Coffee', font = ('Calibri', 12), bg = 'azure', variable = q2, value = 'Coffee')
q2r4.grid(row=3, column = 3, pady = 5, sticky = W)

这再次导致不规则间距。 但这一次,间距与问题 1 中的单选按钮完全不同。并且冲洗并重复每个新的单选按钮问题集。

在此处输入图片说明

右侧的按钮没有问题。 也许是因为它们按行对齐,而不是按列对齐,这导致了间距问题。

bframe = Frame(question, bg='black')
bframe.grid(row=1, padx = 20, sticky = E)

audioq1 = Button(bframe, text = ' Listen to Audio', font = ('Calibri', 14), bg = 'brown1', fg = 'azure', image = sound, relief = SUNKEN, compound = LEFT, command = q1audio)
audioq1.grid(ipadx = 5, pady = 20)
audioq2 = Button(bframe, text = ' Listen to Audio', font = ('Calibri', 14), bg = 'brown1', fg = 'azure', image = sound, relief = SUNKEN, compound = LEFT, command = q2audio)
audioq2.grid(row = 1, ipadx = 5, pady = 20)
audioq3 = Button(bframe, text = ' Listen to Audio', font = ('Calibri', 14), bg = 'brown1', fg = 'azure', image = sound, relief = SUNKEN, compound = LEFT, command = q3audio)
audioq3.grid(row = 2, ipadx = 5, pady = 20)
audioq4 = Button(bframe, text = ' Listen to Audio', font = ('Calibri', 14), bg = 'brown1', fg = 'azure', image = sound, relief = SUNKEN, compound = LEFT, command = q4audio)
audioq4.grid(row = 3, ipadx = 5, pady = 20)
audioq5 = Button(bframe, text = ' Listen to Audio', font = ('Calibri', 14), bg = 'brown1', fg = 'azure', image = sound, relief = SUNKEN, compound = LEFT, command = q5audio)
audioq5.grid(row = 4, ipadx = 5, pady = 20)

在此处输入图片说明

任何帮助将不胜感激!

如果如评论中所述, “重量不一定是问题” ,则可以使用pack而不是grid来实现单选按钮的放置。
这给出了这样的东西(在 Mac 上):

在此处输入图片说明

如果您想要一个更均匀放置的按钮来填充可用宽度,您可以使用grid来实现:

在此处输入图片说明

我还重写了部分代码,以便更轻松地向表单添加问题。 每个问题现在都在自己的框架中,从而具有更大的灵活性。

import tkinter as tk


class QFrame(tk.Frame):
    id = 1
    
    def __init__(self, master, question):
        self.master = master
        super().__init__(self.master)
        self.id = QFrame.id
        QFrame.id += 1
        
        self.q = tk.StringVar()
        self.q.set('None')
        
        self.question, self.choices = question
                    
        self.q_label = tk.Label(self, text=f'Question {self.id}: {self.question}')
        self.q_label.pack(expand=True, anchor=tk.W)
        
        self.choose = []
        for idx, choice in enumerate(self.choices):
            txt, value = choice
            qr = tk.Radiobutton(self, text=txt, variable=self.q, value=value)
            self.choose.append(qr)
            qr.pack(side=tk.LEFT)
            

class App(tk.Tk):
    def __init__(self, questions):
        self.questions = questions
        super().__init__()
        
        for question in questions:
            self.qframe = QFrame(self, question)
            self.qframe.pack(fill=tk.X)
        
            
q1 = ['How often do you eat at Mcdonalds?', 
     (('Everyday!', 'Always'), 
      ('Sometimes', 'Sometimes'), 
      ('Not Frequently', 'Infrequent'),
      ('Never', 'Never'))]
              
q2 = ['What meal do you normally order?', 
     (('Fries!', 'Fries'), 
      ('Hamburgers', 'Hamburgers'), 
      ('Chicken Nuggets', 'Chicken Nuggets'),
      ('Coffee', 'Coffee'))]

q3 = ['how large is your usual party?', 
     (('alone!', 'alone'), 
      ('two', 'two'), 
      ('less than 5', 'less than 5'),
      ('5 or more', '5 or more'))]


questions = [q1, q2, q3]
app = App(questions)
app.mainloop()

grid几何管理器的代码:

class QFrame(tk.Frame):
    id = 1
    
    def __init__(self, master, question):
        self.master = master
        super().__init__(self.master)
        self.id = QFrame.id
        QFrame.id += 1
        
        self.q = tk.StringVar()
        self.q.set('None')
        
        self.question, self.choices = question
        
        self.grid_rowconfigure(0, weight=1)
        for idx in range(4):
            self.grid_columnconfigure(idx, weight=1)
                    
        self.q_label = tk.Label(self, text=f'Question {self.id}: {self.question}')
        self.q_label.grid(row=0, column=0, columnspan=4, sticky="w")
        
        self.choose = []
        for idx, choice in enumerate(self.choices):
            txt, value = choice
            qr = tk.Radiobutton(self, text=txt, variable=self.q, value=value)
            self.choose.append(qr)
            qr.grid(row=1, column=idx, columnspan=1, sticky="ew")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM