【问题标题】:Python Tkinter Grid Manager and Entry WidgetPython Tkinter 网格管理器和条目小部件
【发布时间】:2013-01-01 21:16:34
【问题描述】:

这是我目前的代码:

master = Tk()
Label(master, text="Input:").grid(row=0)

e1 = Entry(master, width = 100)
e1.grid(row=0, column=1)

Button(master, text='Q', command=q_pressed).grid(row=3, column=2,
                                                sticky=W, padx = 4, pady=4)

Button(master, text='C', command =c_input).grid(row=3, column=1,
                                                sticky=W, padx = 0, pady=4)

Button(master, text='Confirm', command=parse_input).grid(row=3, column=0,
                                                sticky=W, padx = 4, pady=4)

我正在尝试使“Q”按钮位于“C”按钮旁边(就像“C”如何位于“确认”按钮旁边),但它却将其放置在 Entry 小部件结束的位置。

我了解这是一个网格管理问题。如何设置布局,使 row = 0,具有文本和条目小部件,而 row=3 具有自己的独立列 (0,1,2) 用于按钮?

【问题讨论】:

  • 第 1 行和第 2 行是什么?
  • 啊,那是胡闹的残余。我制作 GUI 的目的不需要这些行。

标签: python tkinter


【解决方案1】:

您的问题是 Entry e1 很长,包含 100 个字符,但它只跨越一列。您可以使用columnspan 来定义e1grid 命令中使用的列数。以下带有columnspan = 30 的示例对我有用。自己决定,columnspan 的合理值是多少。

from Tkinter import *
master = Tk()
Label(master, text="Input:").grid(row=0)

e1 = Entry(master, width = 100)
e1.grid(row=0, column=1, columnspan=30)

Button(master, text='Q').grid(row=3, column=2)

Button(master, text='C').grid(row=3, column=1)

Button(master, text='Confirm').grid(row=3, column=0)
mainloop()

【讨论】:

  • 那不是columnspan 有效,关于值30 的建议是完全错误的。
  • 我正在更多地研究 columnspan 变量。要了解更多信息,您知道如何在窗口中进行布局吗?例如有 3 行的东西。第 1 行只有两列,第 3 行只有 3 列,如果我要在第 3 行第 1 列添加一个按钮,它将自动在该区域内居中。再次感谢。
  • 我觉得mmgp的回答也回答了这个问题。他的版本真的很干净。剩下的就看你的创意了。
【解决方案2】:

可能有不止一种方式来执行您想要的布局,我选择提供一种干净的方式。您的Entry 小部件在第一行的第二列中占据了很大的水平空间,因此将小部件放在下一行的下方会给您带来麻烦。因为你知道它下面会有 3 个按钮,你可以让这个 Entry 跨越两列(columnspan=2 同时对其进行网格化)并在对下一行进行网格化时使用它。但我更喜欢一种不同的方法,这也会产生更好的整体布局。您想要的是在第二行中将Frame 网格化,该行占用两列(因为在它上面的行中有两个小部件)。然后你在这个新的Frame 上网格化你的按钮。

这会将您的代码变成:

import Tkinter

master = Tkinter.Tk()

Tkinter.Label(master, text="Input:").grid(row=0, column=0)
Tkinter.Entry(master, width = 100).grid(row=0, column=1)

frame = Tkinter.Frame()
frame.grid(row=1, column=0, columnspan=2, sticky='w')
Tkinter.Button(frame, text='Confirm').grid(row=0, column=0, sticky='w')
Tkinter.Button(frame, text='C').grid(row=0, column=1, sticky='w')
Tkinter.Button(frame, text='Q').grid(row=0, column=2, sticky='w')

master.mainloop()

【讨论】:

    【解决方案3】:

    在此处输入代码{ master = Tk() 标签(master, text="Input:" ).grid(row=0)

    e1 = Entry(master, width=100)
    e1.grid(row=0, column=1, columnspan=10)
    
    Button(master, text='Q', width=5, command=q_pressed).grid(row=3, column=1, padx=0, ipadx=5, pady=4, sticky=E)
    
    Button(master, text='C', width=5, command =c_input).grid(row=3, column=1, padx=0, ipadx=5, pady=4, sticky=W)
    
    Button(master, text='Confirm', width=10, command=parse_input).grid(row=3, column=0, padx=0, pady=4, sticky=W)
    
    mainloop()}
    

    由于您需要 100 个字符作为输入字符串,因此我将单元格/列宽设置为 10 以进行简单的数学除法。将我的列跨度设置为 10。我摆脱了 padx,因为它与边框宽度有关,并使用了与内部文本宽度有关的 ipadx。将条目设置为 10 列宽,每列 10 个字符。使用“输入”文本作为 1 列。这将允许我使用 10 个字符或一列作为文本“确认”,并且我可以通过使用 width=5 使按钮“c”和“q”为 5 个字符宽将第 1 列分成两半。然后使用 justfy 将 "c" West 和 "q" East。

    有很多方法,这在我看来是最简单的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多