gpt4 book ai didi

python - 如何将 tkinter 按钮与标签和输入框保持在同一行

转载 作者:行者123 更新时间:2023-12-04 14:21:14 35 4
gpt4 key购买 nike

我正在创建一个简单的条目 UI 来接收 2 个文本字段和一个文件夹路径。我刚刚开始使用 tkinter,我无法让浏览按钮出现在 CSV 文件的输入字段旁边。相反,它与其他按钮一起出现。

我已经阅读了 tkinter 教程。我已经尝试了来自同事和网络的三种不同的 Frame 创意。我确实尝试将它放入一个元素中,但要么我的大脑被炸了,要么我不够好,无法理解它是如何工作的。我认为网格可能是我的答案,但由于这是我尝试过的第一个 UI,因此我无法遵循代码。

import tkinter as tk
fields = 'Version', 'Database Name', 'CSV File'

def fetch(entries):
for entry in entries:
field = entry[0]
text = entry[1].get()
print('%s: "%s"' % (field, text))

def callback():
path = tk.filedialog.askopenfilename()
entry.delete(0, tk.END)
entry.insert(0, path)

def initUI(root, fields):
entries = []
for field in fields:
if field == 'CSV File':
frame = tk.Frame(root)
frame.pack(fill=tk.X)

lbl = tk.Label(frame, text=field, width=20, anchor='w')
lbl.pack(side=tk.LEFT, padx=5, pady=5)

entry = tk.Entry(frame)
entry.pack(fill=tk.X, padx=5)

btn = tk.Button(root, text="Browse", command=callback)
btn.pack(side=tk.RIGHT,padx=5, pady=5)

entries.append((field, entry))
else:
frame = tk.Frame(root)
frame.pack(fill=tk.X)

lbl = tk.Label(frame, text=field, width=20, anchor='w')
lbl.pack(side=tk.LEFT, padx=5, pady=5)

entry = tk.Entry(frame)
entry.pack(fill=tk.X, padx=5, expand=True)

entries.append((field, entry))
return entries

if __name__ == '__main__':
root = tk.Tk()
root.title("Helper")
entries = initUI(root,fields)
root.bind('<Return>', (lambda event, e=entries: fetch(e)))
frame = tk.Frame(root, relief=tk.RAISED, borderwidth=1)
frame.pack(fill=tk.BOTH, expand=True)

closeButton = tk.Button(root, text="Close", command=root.quit)
closeButton.pack(side=tk.RIGHT, padx=5, pady=5)
okButton = tk.Button(root, text="OK", command=(lambda e=entries: fetch(e)))
okButton.pack(side=tk.RIGHT)
root.mainloop()

我想要输入字段旁边的“浏览”按钮,而不是使用“确定”和“关闭”按钮向下的当前位置。

附带问题......我不知道如何让我的回调工作!

最佳答案

Question: How to keep tkinter button on same row as label and entry box



要达到此目的,您必须 pack EntryButton变成自己的 Frame .

Note: Use always side=tk.LEFT to get the widgets in a row.



此示例显示了 OOP解决方案:
enter image description here
  • 定义一个 class LabelEntry继承自 tk.Frame .
    class LabelEntry(tk.Frame):
    def __init__(self, parent, text, button=None):
    super().__init__(parent)
    self.pack(fill=tk.X)

    lbl = tk.Label(self, text=text, width=14, anchor='w')
    lbl.pack(side=tk.LEFT, padx=5, pady=5)
  • 条件:如果Button已通过,新建Framepack EntryButton .
            if button:
    frame2 = tk.Frame(self)
    frame2.pack(side=tk.LEFT, expand=True)

    entry = tk.Entry(frame2)
    entry.pack(side=tk.LEFT, fill=tk.X, padx=5)

    button.pack(in_=frame2, side=tk.LEFT, padx=5, pady=5)
    else:
    entry = tk.Entry(self)
    entry.pack(side=tk.LEFT, fill=tk.X, padx=5)

  • Usage:


  • 定义一个 class App继承自 tk.Tk .
    class App(tk.Tk):
    def __init__(self):
    super().__init__()

    self.title("Helper")

    frame = tk.Frame(self)
    frame.grid(row=0, column=0)
  • 循环 fields并创建一个 LabelEntry目的
            entries = []
    for field in 'Version', 'Database Name', 'CSV File':
    if field == 'CSV File':
    button = tk.Button(text="Browse", command=self.callback)
    entries.append(LabelEntry(frame, field, button))
    else:
    entries.append(LabelEntry(frame, field))
  • 运行应用程序。
    if __name__ == "__main__":
    App().mainloop()

  • 用 Python 测试:3.5

    关于python - 如何将 tkinter 按钮与标签和输入框保持在同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54584673/

    35 4 0