更改tkinter小部件位置

时间:2014-08-28 03:42:36

标签: python user-interface tkinter

我的代码类似于以下

import tkinter as tk
from tkinter import Tk
from tkinter import ttk

root = Tk()

ttk.Label(root, text = 'label text', justify = 'center').grid(row=0, column=0)
string = tk.StringVar()
string.set('entry text')
ttk.Entry(root, textvariable = string).grid(row=0, column=1)
mainButton = ttk.Button(root, text = 'BUTTON').grid(row = 1, columnspan = 2)

root.pack()

实际上,这会使第一行在其旁边有一个标签和一个文本框,在同一行上,然后是两个下面的按钮。现在,当按下该按钮时,我想在包含按钮的行中添加新标签/条目,并将按钮向下移动一行。有可行的方法吗?

3 个答案:

答案 0 :(得分:6)

使用grid_forget,您可以移除该按钮,然后使用grid将其重新放置在新位置。我在下面的例子中证明了这一点。 我已将您的程序变为class,因此您可以轻松地传递变量,例如字符串到self。如您所见,我已将每个新StringVar添加到self.string。这样,您可以使用self.string[index].get()

检索每个窗口小部件的条目文本
import tkinter as tk
from tkinter import ttk

class App():

    def __init__(self):
        self.root = tk.Tk()

        ttk.Label(self.root, text = 'label text', justify = 'center').grid(row=0, column=0)
        self.string = [tk.StringVar()]
        self.string[0].set('entry text')
        ttk.Entry(self.root, textvariable = self.string[0]).grid(row=0, column=1)
        self.mainButton = ttk.Button(self.root, text = 'BUTTON', command=self.callback)
        self.mainButton.grid(row = 1, columnspan = 2)

        self.root.mainloop()

    def callback(self):
        self.mainButton.grid_forget()
        self.string.append(tk.StringVar())
        l = len(self.string)
        self.string[l-1].set('entry text')
        ttk.Label(self.root, text = 'label text', justify = 'center').grid(row=l-1, column=0)
        ttk.Entry(self.root, textvariable = self.string[l-1]).grid(row=l-1, column=1)
        self.mainButton.grid(row = l, columnspan = 2)

App()

答案 1 :(得分:0)

这应该有效。您所做的就是为按钮设置命令,并为其编写一个函数。如果你说原始代码有效,那么这也应该。

import tkinter as tk
from tkinter import Tk
from tkinter import ttk

root = Tk()

ttk.Label(tab, text = 'label text', justify = 'center').grid(row=0, column=0)
string = tk.StringVar()
string.set('entry text')
ttk.Entry(tab, textvariable = string).grid(row=0, column=1)

def clicked():
    ttk.Label(tab, text = 'label text 2', justify = 'center').grid(row=1, column=0)
    string2 = tk.StringVar()
    string.set('entry text')
    ttk.Entry(tab, textvariable = string).grid(row=1, column=1)

mainButton = ttk.Button(mainTab, text = 'BUTTON', command = clicked)
mainbutton.grid(row = 2, columnspan = 2)
# mainbutton row=2 will automatically sit at row 1 until a new row 'pushes' it down

root.pack()

答案 2 :(得分:0)

我已经修复了W1ll1amvl的代码,因此它的功能会更好!

from tkinter import ttk
from tkinter import Tk, Label, Button, StringVar, Entry


root = Tk()

Label(root, text = 'label text', justify = 'center').grid(row=0, column=0)
string = StringVar()
string.set('entry text')
Entry(root, textvariable = string).grid(row=0, column=1)

def clicked():
    Label(root, text = 'label text 2', justify = 'center').grid(row=1, column=0)
    string2 = StringVar()
    string.set('entry text')
    Entry(root, textvariable = string).grid(row=1, column=1)

mainButton = Button(root, text = 'BUTTON', command = clicked)
mainButton.grid(row = 2, columnspan = 2)
# mainbutton row=2 will automatically sit at row 1 until a new row 'pushes' it down