2012-07-06 13 views
1

如果我在同一個框架中有幾個行和多個具有多個條目/標籤小部件的列,是否可以選擇其中的一個並將其刪除,而將其他人單獨刪除。刪除網格中的某些行/列Tkinter

例如

class Window(): 
    def __init__(self): 
     self.root = Tk() 
     self.win1 = Frame(self.root) 
     entry1 = Entry(win1, row=1, column=1) 
     entry2 = Entry(win1, row=1, column=2) 
     label1 = Label(win1, row=1, column=3) 

    def main1(self): 
     label2 = Label(win1, row=1, column=4) 
     labeln = Label(win1, row=1, column=n) 

然後,我想從第3列開始移除,其中n可能是一個隨機數。是否有可能獲得grid_forget並插入列數?這些行也是可以的嗎?

更新:或者是否可以簡單地返回到init創建的窗口,並刪除在main1下創建的窗口(但已在同一個框架中創建)?

謝謝。

+0

你在問什麼是一種tk的動態佈局。我曾經嘗試過它,海事組織是不可能的。 因此我採取了間接方法。請檢查我的答案。 – Ani 2012-07-06 08:29:47

+0

我很欣賞你的答案,但我真的不想讓它太複雜。有沒有辦法清除我的主窗口,然後恢復__init__小部件等? – user2063 2012-07-06 08:38:04

+0

@Ani:「這是不可能的」是完全錯誤的。沒有什麼能夠阻止您創建高度動態的用戶界面。可以說,tkinter比許多其他工具包更有能力。 – 2012-07-06 13:47:45

回答

0

在grid_remove和grid_forget方法閱讀起來;這些將允許您從視圖中刪除現有的小部件。你也可以銷燬小部件,使它們消失。

我已經做了一段時間(現在還沒有一臺可以創建示例的計算機),但我認爲一個問題可能是您必須進入並明確設置網格行和/或列高度,寬度或權重回到零以回收空間。這是非常可行的。

您的另一種選擇是通過方法或函數創建所有小部件。然後,您可以輕鬆銷燬並重新創建所有小部件。由於整個用戶界面將「閃爍」,所以用戶可能不那麼愉快。

+0

謝謝=)我已經嘗試過,併成功地刪除了我的4盒(我沒有直接鏈接到我在問題中的簡短示例)。最後一格已被刪除,但仍然有些東西因爲背景顏色仍然留在這個空間。有任何想法嗎? – user2063 2012-07-06 14:04:50

+0

事實上,我有兩種情況需要發生這種情況(取決於if語句中的選項),並且它會刪除除一個方框外的所有方塊,但會保留根窗口背景顏色,而另一個選項幾乎可以刪除所有內容,但是你仍然可以在窗口的末端看到它偷看。= S – user2063 2012-07-06 14:17:14

+0

@ user2063:如果背景顏色顯示,那意味着沒有任何東西。正如我在答案中所說的那樣,您可能必須將列或行的權重設置爲零,以便其他列或行擴展以填充。 – 2012-07-06 14:46:57

-1

這裏有一個csh腳本來爲GUI創建一個動態python代碼。

它做什麼?

進入

./dynamic_python -label姓名,年齡-frame myframe

,它會創建一個名爲名稱2標籤,年齡,各爲2標籤輸入框和其他一些小部件。 我知道這不完全是你需要的,但考慮一下你的解決方案的可能方法。 如果您需要更多幫助,請給我打電話。 將瞭解其他用戶的反饋:)

CODE爲dynamic_python:

#! /bin/csh -f 

#echo $argv[1] 
#shift 
#echo $argv[1] 
while ("$#" != 0) 
    if("$argv[1]" == "-label") then 
     set label = "$argv[2]" 
     shift 
     shift 
    endif 
    if("$argv[1]" == "-frame") then 
     set frame = "$argv[2]" 
     shift 
     shift 
    endif 
end 
set label = `echo $label | sed 's/,/ /g'` 
set lcount = `expr "$#label" + 1` 
set lc = 1 
# 
echo "#! /usr/bin/python" > dy.py 
echo "from Tkinter import *" >> dy.py 
# 
echo "def fun_ok():" >> dy.py 
echo " print 'OK_Accepted'" >> dy.py 
set label = `echo $label | sed 's/,/ /g'` 
set lcount = `expr "$#label" + 1` 
set lc = 1 
echo " list_out = []" >> dy.py 
while ($lc != $lcount) 
    echo " print $label[$lc].get()" >> dy.py 
    echo " list_out.append('-$label[$lc]')" >> dy.py 
    echo " list_out.append($label[$lc].get())" >> dy.py 
    set lc = `expr "$lc" + 1` 
end 
echo " print list_out" >> dy.py 
# 
echo "$frame = Tk()" >> dy.py 
# 
set label = `echo $label | sed 's/,/ /g'` 
set lcount = `expr "$#label" + 1` 
set lc = 1 
while ($lc != $lcount) 
    echo $lc $label[$lc] 
    echo "$label[$lc] = StringVar()" >> dy.py 
    echo "Label($frame,text="_$label[$lc]_").grid(row = $lc,column = 1)" | sed 's/_/"/g' >> dy.py 
    echo "Entry($frame,textvariable=$label[$lc]).grid(row=$lc,column=2)" >> dy.py 
    set lc = `expr "$lc" + 1` 
end 
echo "Button($frame,text='OK',command=fun_ok).grid(row = $lc,column = 1)" >> dy.py 
echo "Button($frame,text='EXIT',command=$frame.quit).grid(row = $lc,column = 2)" >> dy.py 
#Button(master, text="OK", command=callback) 
# 
echo "$frame.mainloop()" >> dy.py 
# 
chmod 755 * 
dy.py 
+0

-1抱歉,但這太複雜了,難以維護。 – 2012-07-06 13:57:26

+0

@BryanOakley我同意它很難維護。我希望能夠學會做到這一點。 – Ani 2012-07-06 17:49:45