【问题标题】:How do I float tkinter buttons vertically on the left side如何在左侧垂直浮动 tkinter 按钮
【发布时间】:2021-04-17 23:10:10
【问题描述】:

我希望我的 tkinter 按钮、条目和文本垂直浮动在左侧的中间。我尝试过使用带有 side=left 的 pack(),但它只是将它们水平堆叠,如果我可以垂直堆叠它们,那将是完美的。我试过使用网格,但我无法让它们进入中间。我已经尝试过锚 w 但这也不起作用。谢谢!

import tkinter as tk

class Fullscreen:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title("Example")
        self.fullScreenState = True 
        self.window.attributes("-fullscreen", self.fullScreenState)

        self.w, self.h = self.window.winfo_screenwidth(), self.window.winfo_screenheight()
        self.window.geometry("%dx%d" % (self.w, self.h))
        
        self.window.bind("<F11>", self.toggleFullScreen)
        self.window.bind("<Escape>", self.quitFullScreen)

        def room_button():
            room_text = room_key.get()
            print(room_text)

        def message_button():
            message_text = message.get(1.0, tk.END)
            handle_text = handle.get()
            print(message_text)
            print(handle_text)
           
        greeting = tk.Label(text="Welcome")
        # Pack displays the Label's text in the window.
        greeting.grid(column=1, sticky='w')

        display_room = tk.Label(text="Room:")
        display_room.grid(column=1, sticky='w')

        room_key = tk.Entry()
        room_key.grid(column=1, sticky='w')

        send_room_key = tk.Button(text="Change Rooms", command=room_button)
        send_room_key.grid(column=1, sticky='w')

        display_message = tk.Label(text="Message:")
        display_message.grid(column=1, sticky='w')

        message = tk.Text()
        message.grid(column=1, sticky='w')

        display_handle = tk.Label(text="Handle (optional):")
        display_handle.grid(column=1, sticky='w')

        handle = tk.Entry()
        handle.grid(column=1, sticky='w')

        send_message = tk.Button(text="Send Message", command=message_button)
        send_message.grid(column=1, sticky='w')

        quit_button = tk.Button(text="Quit", command=self.window.destroy)
        quit_button.grid(column=1, sticky='w')

        self.window.mainloop()

    def toggleFullScreen(self, event):
        self.fullScreenState = not self.fullScreenState
        self.window.attributes("-fullscreen", self.fullScreenState)

    def quitFullScreen(self, event):
        self.fullScreenState = False
        self.window.attributes("-fullscreen", self.fullScreenState)

if __name__ == '__main__':
    app = Fullscreen() 

【问题讨论】:

  • 您可以尝试使用.place 而不是.grid。有了它,您可以指定每个小部件的x 和y 位置。或者您可以尝试在使用.grid 时传入pady 参数,如下所示:.grid(pady=20)
  • 将按钮放在左侧的框架中

标签: python tkinter tk


【解决方案1】:

这是你希望他们成为的样子吗:

from tkinter import Tk, Frame, Label, Entry, Button


root = Tk()
root.geometry('500x400')

widget_frame = Frame(root)
widget_frame.pack(side='left')

Label(widget_frame, text='Enter info below').pack()
entry = Entry(widget_frame)
entry.pack()
Button(widget_frame, text='Submit').pack()

root.mainloop()

您可以只使用将被打包到左侧的框架并将小部件打包在框架内,它们将位于左侧和中心

【讨论】:

  • 是的,这正是我想要做的!所以基本上我想要的所有东西都可以打包到一个框架中,然后把框架放在我想要的地方?非常感谢!
  • @draoner 好吧,这就是框架的用途(据我所知)。如果需要,您还可以在框架内放置一个框架,并且在使用框架时可以混合布局方法,在一个框架中您可以在另一个包中使用网格
  • 你比我读过的所有教程都更有帮助!我更新了我的代码,它运行良好!
【解决方案2】:

你也可以这样用:

import tkinter as tk

root = tk.Tk()
root.geometry("500x400")

label = tk.Label(root, text="Enter info below")
label.grid(row=1, column=1, pady=(150, 0))
entry = tk.Entry(root)
entry.grid(row=2, column=1)
button = tk.Button(root, text='Submit')
button.grid(row=3, column=1)

root.mainloop()

pady=(150, 0) 告诉grid 方法它应该在小部件上方留出 150 像素为空。这将使您能够更好地控制小部件的放置位置。

【讨论】:

  • 我唯一的问题是它不能适应窗口的大小。有没有办法让它与网格垂直居中?
  • @draoner 我添加我的答案只是为了给你对未来项目的建议。使用.grid 并试图将其居中会非常困难。使用@Matiiss 的答案。
  • 明白了!对此,我真的非常感激!谢谢!
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 2019-03-23
  • 2014-11-17
  • 2019-11-18
  • 2012-05-23
  • 2019-12-04
  • 2021-10-06
  • 2015-09-15
相关资源
最近更新 更多