2013-05-03 43 views
0

我構建了一個窗口,其中顯示了一些標籤,一個輸入字段和一個按鈕。該按鈕打開一個tkinter.filedialog.askdirectory()。在我選擇一個目錄並關閉對話框後,另一個標籤將隨着文本條目一起更新。防止標籤在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   |  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留空。它的寬度= const = 0。忘記它。
Select不附加到Entry。列#1和#2將它們分開。 Select附加到#0列的右邊緣。
當您更新Label時,增加#2列的寬度=>增加#0(Select)和#3(Entry)之間的空間。 Select保持連接到#0的右邊緣。

+0

這是一個有用的解決方法,但它不是我問的。我評論了將關閉對話框的標籤,並且我想知道_why_它重新排列。 – mmassaro 2013-05-03 12:43:00

+0

我更新了答案 – kalgasnik 2013-05-03 16:22:33

+0

清除了一切,謝謝! – mmassaro 2013-05-04 08:20:47