TKinter Geometry Manager отображает несколько строк виджетов - PullRequest
0 голосов
/ 21 мая 2018

Я хочу отобразить список предложений с пропущенными словами.Основная идея, состоящая из одной строки, такова: One line example

Конструкция, описанная выше, представляет собой «label + entry + label + spacing + label».Чтобы убедиться, что виджеты были выровнены по левому краю, я использовал следующий код:

phraseLabel1 = tk.Label(questionFrame)
phraseLabel1.pack(side=tk.LEFT)

keyWordEntry = tk.Entry(questionFrame)
keyWordEntry.pack(side=tk.LEFT)

phraseLabel2 = tk.Label(questionFrame)
phraseLabel2.pack(side=tk.LEFT)

keyWordLabel = tk.Label(questionFrame)
keyWordLabel.pack(side=tk.LEFT,padx=30) 

Моя цель - предоставить пользователям экран ввода для нескольких предложений.Как, например, приведено на следующем рисунке:

Example multiple lines

Хотя мне удается создавать метки с помощью нижнего (экспериментального) кода, у меня нет понимания, как управлятьгеометрия.

root = tk.Tk()
root.title("myTest")
root.geometry("700x700")

questionFrame = tk.Frame(root)
resultFrame = tk.Frame(root)

for frame in (questionFrame, resultFrame):
     frame.grid(row=0, column=0, sticky='news')

#DB Query returning a set of phrases and Keywords
(zinPhrase1, zinPhrase2, keyWordFR, keyWordNL)=getPhrase() 

#Init 
lab1 = []
keyWordEntry = []
lab2 = []
keyWord = []


for i in range(4): #4 is entered as a dummy value

    lab1.append(tk.Label(questionFrame))    
    lab1[i].pack()

    keyWordEntry.append(tk.Entry(questionFrame))
    keyWordEntry[i].pack()

    lab2.append(tk.Label(questionFrame))    
    lab2[i].pack()

    keyWord.append(tk.Label(questionFrame))
    keyWord[i].pack()

    lab1[i].config(text=zinPhrase1[i])
    keyWordEntry[i].config(width=8)
    lab2[i].config(text=zinPhrase2[i])
    keyWord[i].config(text=keyWordNL[i],fg="red")

questionFrame.tkraise()
root.mainloop()

Как я могу управлять размещением виджетов построчно, как показано на рисунке выше?Любая помощь будет с благодарностью.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Поскольку вы, похоже, не хотите организовывать свои виджеты в сетке, наиболее распространенным решением этой проблемы является создание рамки для каждой строки.Фреймы располагаются сверху вниз, а виджеты внутри стека располагаются слева направо.

По моему опыту, код GUI гораздо проще визуализировать, когда вы отделяете создание виджета от макета виджета, поэтому я сделал это в следующем примере, чтобы, надеюсь, было легче понять.

for i in range(4): #4 is entered as a dummy value
    rowFrame = tk.Frame(questionFrame)
    rowFrame.pack(side="top", fill="x")

    lab1.append(tk.Label(rowFrame))    
    keyWordEntry.append(tk.Entry(rowFrame))
    lab2.append(tk.Label(rowFrame))    
    keyWord.append(tk.Label(rowFrame))

    lab1[i].pack(side="left")
    keyWordEntry[i].pack(side="left")
    lab2[i].pack(side="left", padx=(0, 40))
    keyWord[i].pack(side="left")

    lab1[i].config(text=zinPhrase1[i])
    keyWordEntry[i].config(width=8)
    lab2[i].config(text=zinPhrase2[i])
    keyWord[i].config(text=keyWordNL[i],fg="red")

Приведенный выше код выглядит примерно так:

enter image description here

0 голосов
/ 21 мая 2018

Достаточно ли что-то вроде следующего?

for i in range(4): #4 is entered as a dummy value
    frames.append(tk.Frame(questionFrame))
    frames[i].grid(row=i, column=0, stick='W')

for i in range(4):
    lab1.append(tk.Label(frames[i]))
    lab1[i].grid(row=0, column=0)


    keyWordEntry.append(tk.Entry(frames[i]))
    keyWordEntry[i].grid(row=0, column=1)

    lab2.append(tk.Label(frames[i]))
    lab2[i].grid(row=0, column=2)

    keyWord.append(tk.Label(frames[i]))
    keyWord[i].grid(row=0, column=3)

    lab1[i].config(text=zinPhrase1[i])
    keyWordEntry[i].config(width=8)
    lab2[i].config(text=zinPhrase2[i])
    keyWord[i].config(text=keyWordNL[i],fg="red")

enter image description here

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