Python GUI框架和按钮布局,如何添加框架和按钮到正确的位置?

2024-05-13 04:46:53 发布

您现在位置:Python中文网/ 问答频道 /正文

def create_layout(frame):

frame = Frame(frame, bg = 'red')
frame.pack(side = LEFT, fill=BOTH)

b = Button(frame, text='Button1', command=pressed, padx = 20)
b.pack(pady = 20, padx = 20)
c = Button(frame, text='Button2', command=pressed, padx=20)
c.pack(pady = 20, padx = 20)

到目前为止,我得到了这个代码,假设已经调用了来自Tkinter import*的代码,并且框架已经有了它的大小和颜色设置。它应该看起来像下图。然而,我永远不能得到按钮3和4的框架在右边,每当我添加一个按钮,它会在红色的框架。

enter image description here


Tags: 代码text框架defcreatebutton按钮frame
3条回答

您需要添加另一个位于右侧的框架,然后将按钮3和按钮4打包到其中。可能将先前的帧更改为frame1,然后:

frame2 = Frame(frame, bg = "yellow")
frame2.pack(side = RIGHT, fill = BOTH)

然后,创建按钮并将其打包。希望这有帮助!

你有两个框架和四个按钮。

让我们创建一个名为create_widgets()的函数,它只包含调用另外两个函数create_frames()create_buttons()

对于帧,我们使用^{}布局管理器:

def create_frames(self):
   self.left_frame = tk.Frame(width=140, height=140, background='red')       
   self.left_frame.grid(row=0, column=0)

   self.right_frame = tk.Frame(width=300, height=140, background='gold2')       
   self.right_frame.grid(row=0, column=1) 

这将创建此接口:

enter image description here

让我们设计create_buttons()的方式,它只包括调用两个不同的函数,每个函数都有一个特定的任务:

  • create_left_frame_buttons()为左框架创建按钮
  • create_right_frame_buttons()为右框架创建按钮

以下是它们的简单实现:

def create_buttons(self):
   self.create_left_frame_buttons()
   self.create_right_frame_buttons()       

def create_left_frame_buttons(self):
   self.button1 = tk.Button(self.left_frame, text='Button1')       
   self.button1.grid(row=0, column=0, padx=30, pady=20)

   self.button2 = tk.Button(self.left_frame, text='Button2')       
   self.button2.grid(row=1, column=0, padx=30, pady=20)       

def create_right_frame_buttons(self):
   self.button1 = tk.Button(self.right_frame, text='Button3')       
   self.button1.grid(row=0, column=0, padx=20, pady=50)

   self.button2 = tk.Button(self.right_frame, text='Button4')       
   self.button2.grid(row=0, column=1, padx=70)

请注意,我使用选项padxpady在按钮之间创建适当的间距。

到目前为止,这是最终的界面:

enter image description here

你可以看到左框和右框都在缩小,结果很难看。为了解决这个问题,我们可以为每个帧设置rid_propagate(0)

因此,根据这些观察和以下Tkinter best practices,这里是完整的代码:

import tkinter as tk


class MainApplication(tk.Frame):
   def __init__(self, master):
       self.master = master
       tk.Frame.__init__(self, self.master)
       self.configure_gui()
       self.create_widgets()

   def configure_gui(self):
       self.master.title('Simple layout')
       self.master.geometry('440x140')
       self.master.resizable(0, 0)

   def create_widgets(self):
       self.create_frames()
       self.create_buttons()

   def create_frames(self):
       self.left_frame = tk.Frame(width=140, height=140, background='red')
       self.left_frame.grid_propagate(0)
       self.left_frame.grid(row=0, column=0)

       self.right_frame = tk.Frame(width=300, height=140, background='gold2')
       self.right_frame.grid_propagate(0)
       self.right_frame.grid(row=0, column=1)   

   def create_buttons(self):
       self.create_left_frame_buttons()
       self.create_right_frame_buttons()       

   def create_left_frame_buttons(self):
       self.button1 = tk.Button(self.left_frame, text='Button1')       
       self.button1.grid(row=0, column=0, padx=30, pady=20)

       self.button2 = tk.Button(self.left_frame, text='Button2')       
       self.button2.grid(row=1, column=0, padx=30, pady=20)       

   def create_right_frame_buttons(self):
       self.button1 = tk.Button(self.right_frame, text='Button3')       
       self.button1.grid(row=0, column=0, padx=20, pady=50)

       self.button2 = tk.Button(self.right_frame, text='Button4')       
       self.button2.grid(row=0, column=1, padx=70)


if __name__ == '__main__':
   root = tk.Tk()
   main_app =  MainApplication(root)
   root.mainloop()

演示:

enter image description here

好的,第一组按钮,按钮1和2在“框架”中,按钮3和4应该省略。

因此,使用按钮1和2,打开背景为红色的框架,将其包装为side=tk.LEFT,同时填充和展开它。

使用按钮3和4,只需将其左偏并展开即可。那就像一种款待;-)

相关问题 更多 >