【问题标题】:Deleting certain rows/columns in a grid Tkinter删除网格 Tkinter 中的某些行/列
【发布时间】:2012-07-06 07:47:28
【问题描述】:

如果我在同一个框架中有几行和几列带有多个条目/标签小部件,是否可以只选择其中一个并将其删除,同时不理会其他小部件。

例如

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 下创建的窗口(但已在同一框架中创建)?

谢谢。

【问题讨论】:

  • 您要问的是 tk 的动态布局。我之前尝试过,IMO 不可能。因此我采取了间接的方法。请检查我的答案。
  • 感谢您的回答,但我真的不想让它变得太复杂。有没有办法清除我的主窗口,然后恢复 init 小部件等?
  • @Ani:“不可能”是完全错误的。没有什么可以阻止您创建高度动态的 UI。可以说,tkinter 比许多其他工具包更能做到这一点。

标签: python user-interface tkinter ttk


【解决方案1】:

阅读 grid_remove 和 grid_forget 方法;这些将允许您从视图中删除现有的小部件。您还可以销毁小部件,使它们消失。

我已经有一段时间没有这样做了(目前还没有可以创建示例的计算机),但我认为一个棘手的问题可能是您必须进入并明确设置网格行和/或列的高度、宽度或权重归零以回收空间。不过还是蛮可行的。

您的另一个选择是通过方法或函数创建所有小部件。然后,您可以很容易地销毁并重新创建所有小部件。这对用户来说可能不太愉快,因为整个 UI 都会“闪烁”。

【讨论】:

  • 谢谢 =) 我已经尝试过了,并成功移除了我拥有的 4 个盒子中的 3 个(与我在问题中的简短示例没有直接链接)。最后一个框已被移除,但由于背景颜色保留在此空间中,因此仍有一些东西。有什么想法吗?
  • 事实上,我有两种情况需要发生这种情况(取决于 if 语句中的选项),它会删除除一个框之外的所有框,但几乎保留根窗口背景颜色和另一个选项设法将其全部删除,但您仍然可以看到它在窗口的尽头向外窥视.. =S
  • @user2063:如果显示背景颜色,则意味着那里什么都没有。正如我在答案中所说,您可能必须将列或行的权重设置为零,以便其他列或行扩展以填充。
【解决方案2】:

这是一个用于为 GUI 创建动态 python 代码的 csh 脚本。

它有什么作用?

输入

./dynamic_python -label name,age -frame myframe

它将创建 2 个名为 name,age 的标签,为每个标签和一些其他小部件创建 2 个输入框。 我知道这并不完全是您所需要的,但请考虑以一种可能的方法来解决您的问题。 如果您需要更多帮助,请联系我。 将感谢其他用户的反馈:)

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

【讨论】:

  • -1 抱歉,但这太复杂且难以维护。
  • @BryanOakley 我同意它很难维护。我希望能学到一些方法来做到这一点。
猜你喜欢
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 2022-11-22
  • 2023-02-25
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
相关资源
最近更新 更多