【问题标题】:Why isn't this frame in tkinter centered correctly?为什么 tkinter 中的这个框架没有正确居中?
【发布时间】:2023-04-03 10:48:01
【问题描述】:

我希望这个条目栏和稍后我将添加到框架中的其他内容正确居中,我收到了这个应该可以工作的代码,但事实并非如此。

import tkinter as tk
import math
import time

root = tk.Tk()
root.geometry()
root.attributes("-fullscreen", True)

exit_button = tk.Button(root, text = "Exit", command = root.destroy)
exit_button.place(x=1506, y=0)

frame = tk.Frame(root)
main_entry = tk.Entry(root, width = 100, fg = "black")
main_entry.place(x=50, y=50)
frame.place(relx=.5,rely=.5, anchor='center')

root.mainloop()

如您所见,框架未居中,我该如何解决?

【问题讨论】:

  • 也许可以为背景添加颜色以查看它的外观。也许 Frame 居中,但 Entry 未居中。
  • Frame 自动将大小更改为Frame 内对象的大小(当您使用pack() 时)-但您在Frame 内没有任何内容-您将所有小部件直接放在root 中-所以它没有大小(宽度为零,高度为零)并且不可见。当我使用tk.Frame(root, bg='red', width=100, height=100) 时,我会在中心看到红框。顺便说一句:如果你想在Frame 中使用Entry,那么使用tk.Entry(frame, ...) 而不是tk.Entry(root, ...)
  • 所以你有两个问题:(1)你把Entry放在错误的父级中-它必须是frame而不是root,(2)你使用place(),它没有' t 将 Frame 的大小调整为其子级 - 并且它的大小为零。

标签: python user-interface tkinter pycharm widget


【解决方案1】:

为了实现全屏居中小部件,我不得不使用网格管理器。 下面的代码可以工作,但确切的定位需要对框架填充进行一些摆弄。 frame padx = w/2-300 和 pady = h/2-45 是经过反复试验找到的任意值。

    import tkinter as tk

    root = tk.Tk()
    root.attributes( '-fullscreen', True )
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()

    frame = tk.Frame( root )
    main_entry = tk.Entry( frame, width = 100 )
    main_entry.grid( row = 0, column = 0, sticky = tk.NSEW )
    frame.grid( row = 0, column = 0, padx = w/2-300, pady = h/2-45,  sticky = tk.NSEW )
    exit_button = tk.Button( frame, text = 'Exit', command = root.destroy )
    exit_button.grid( row = 1, column = 0, sticky = tk.NSEW )

    tk.mainloop()

【讨论】:

    【解决方案2】:

    Frame 自动将大小更改为 Frame 内的对象大小(当您使用 pack() 时),但 Frame 内没有任何内容。您将所有小部件直接放在root 中 - 所以Frame 没有大小(宽度为零,高度为零)并且不可见。

    当我使用tk.Frame(root, bg='red', width=100, height=100) 时,我看到中间有小红框。

    你有两个问题:

    (1) 你把 Entry 放在了错误的父级 - 它必须是 frame 而不是 root

    (2) 你使用place(),它不会将Frame 的大小调整为它的孩子,并且它的大小为零——所以你看不到它。您必须手动设置 Frame 的大小(即tk.Frame(..., width=100, height=100)),或者您可以使用pack(),它会自动调整大小。

    我为背景添加颜色以查看小部件。 blue 用于窗口,red 用于框架。

    import tkinter as tk
    
    root = tk.Tk()
    root['bg'] = 'blue'
    
    root.attributes("-fullscreen", True)
    
    exit_button = tk.Button(root, text="Exit", command=root.destroy)
    exit_button.place(x=1506, y=0)
    
    frame = tk.Frame(root, bg='red')
    frame.place(relx=.5, rely=.5, anchor='center')
    
    main_entry = tk.Entry(frame, width=100, fg="black")
    main_entry.pack(padx=50, pady=50)  # with external margins 50
    
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 1970-01-01
      • 2011-07-04
      • 2023-01-02
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2011-10-21
      • 2021-11-16
      相关资源
      最近更新 更多