在askdirectory()关闭后,防止标签重新对齐

时间:2013-05-03 11:46:06

标签: python tkinter python-3.3

我建了一个窗口,显示一些标签,一个输入字段和一个按钮。该按钮会打开tkinter.filedialog.askdirectory()。选择目录并关闭对话框后,另一个标签会随文本条目一起更新。

问题是在发生这种情况之后,文本条目的描述(左边的另一个标签)在其单元格中重新排列。我不知道为什么会发生这种情况,是否有任何我不知道的幕后行为?

以下是我使用的示例代码。

from tkinter import *
from tkinter import filedialog
from tkinter import ttk


def folderDiag():
    scanfolder.set(filedialog.askdirectory())

c = (N, W, S, E)
scanfolder = StringVar()

root = Tk()
root.title("Testing")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

frame = ttk.Frame(root, padding="3")
frame.grid(column=0, row=0, sticky=c)
frame.columnconfigure(0, weight=1)
frame.columnconfigure(1, weight=1)
frame.columnconfigure(2, weight=1)
frame.rowconfigure(0, weight=1)
frame.rowconfigure(1, weight=1)
frame.rowconfigure(2, weight=1)
ttk.Label(frame, text="Welcome!",
          font="TkDefaultFont 24 bold").grid(column=0, row=0, columnspan=4,
                                             sticky=c)
# This label will be centered after dialog is closed
ttk.Label(frame, text="Select folder to scan:").grid(column=0, row=1, sticky=E)
ttk.Label(frame, textvariable=scanfolder).grid(column=2, row=2)

scan_folder_entry = ttk.Entry(frame, textvariable=scanfolder).grid(column=3,
                                                                   row=1)
browse_button = ttk.Button(frame, text="Browse...",
                           command=folderDiag).grid(column=4, row=1)

root.mainloop()
exit(1)

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你需要这个:

|    0    |         1         |      2     |  # Column number
|                Welcome!                  |
| Select  |       Entry       |   Button   |
| Your label                               |

所以:

from tkinter import *
from tkinter import filedialog
from tkinter import ttk

def folderDiag():
    scanfolder.set(filedialog.askdirectory())

root = Tk()

c = (N, W, S, E)
scanfolder = StringVar()

root.title("Testing")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

frame = ttk.Frame(root, padding="3")
frame.grid(column=0, row=0, sticky=c)
frame.columnconfigure(0, weight=0)
frame.columnconfigure(1, weight=1)
frame.columnconfigure(2, weight=0)
frame.rowconfigure(0, weight=1)
frame.rowconfigure(1, weight=1)
frame.rowconfigure(2, weight=1)
ttk.Label(frame, text="Welcome!",
          font="TkDefaultFont 24 bold").grid(column=0, row=0, columnspan=3,
                                             sticky=c)
ttk.Label(frame, text="Select folder to scan:").grid(column=0, row=1, sticky=E)
ttk.Label(frame, textvariable=scanfolder, justify=LEFT).grid(column=0, columnspan=3, row=2, sticky=W)

scan_folder_entry = ttk.Entry(frame, textvariable=scanfolder)
scan_folder_entry.grid(column=1, row=1, sticky=EW)
browse_button = ttk.Button(frame, text="Browse...",
                           command=folderDiag)
browse_button.grid(column=2, row=1)

root.mainloop()

您的代码创建了此布局:

|   0    | 1 |    2    |    3   |    4   |
| Welcome                       |  ---   |
| Select | - |   ---   | Entry  | Button |
|   ---  | - |  Label  |   ---  |   ---  |

enter image description here

出于某种原因,你将#1留空。它的宽度=常数= 0.忘了它。
Select未附加Entry。第1列和第2列将它们分开。 Select附加在#0列的右边缘 更新Label后,您需要增加#2列的宽度=>你增加了#0(Select)和#3(Entry)之间的空间。 Select保持与#0的右边缘相连。