Как удерживать кнопку tkinter в одной строке с надписью и полем ввода - PullRequest
0 голосов
/ 08 февраля 2019

Я создаю простой пользовательский интерфейс для ввода 2 текстовых полей и пути к папке.Я только начинаю работать с tkinter и не могу отобразить кнопку обзора рядом с полем ввода для файла CSV.Вместо этого он появляется с другими кнопками.

Я прочитал учебник по tkinter.Я попробовал три разные идеи Frame от коллег и из Интернета.Я пытался поместить это в элемент, но либо мой мозг зажарен, либо я просто недостаточно хорош, чтобы понять, как это работает.Я думаю, что сетки могут быть моим ответом, но так как это первый пользовательский интерфейс, который я пробовал, я не могу следовать коду.

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()  

Мне нужна кнопка «Обзор» рядом с полем вводаего текущего местоположения вниз с помощью кнопок OK и Close.

Боковая проблема ... Я не могу понять, как заставить мой обратный вызов работать!

1 Ответ

0 голосов
/ 08 февраля 2019

Вопрос : Как удерживать кнопку tkinter в том же ряду, что и надписи и поле ввода

Чтобы достичь этого, вам нужно pack Entry иButton в собственное Frame.

Примечание : всегда используйте side=tk.LEFT для получения виджетов в строке.

В этом примере показано решение 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, создайте новые Frame до pack Entry и Button.

            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)
    

Использование :

  • Определение наследования 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...