如何不断更新变量(使用带有tkinter的Spinbox)?

时间:2019-03-16 10:26:18

标签: python tkinter

我的程序中有两个用tkinter创建的Spinbox。我希望将用户选择的变量添加到列表中,以便稍后可以在程序中使用这些值。我目前遇到的问题是这些值仅在列表中存储一次,尽管我做了所有尝试,但我无法更新它们。明确地说,我只希望列表中有两个值,所以当用户选择另一个数字时,它将替换存储在列表中的正确值。

这是我写的代码:

from tkinter import *

windowTk = Tk()
pwMain = PanedWindow(windowTk, orient=VERTICAL)
pwTop = PanedWindow(pwMain, orient=HORIZONTAL)

def configTables() :

    sLine = Spinbox(pwTop, from_=0, to=15)
    pwTop.add( Label(pwTop, text = "Combien y a-t-il de lignes de table ?") )
    pwTop.add( sLine )

    sColumn = Spinbox(pwTop, from_=0, to=15)
    pwTop.add( Label(pwTop, text = "Combien y a-t-il de colonnes de tables ?") )
    pwTop.add( sColumn )

    pwTop.pack()

    pwMain.pack()

    global coordTables
    coordTables = []
    coordTables.append( int(sLine.get()) )
    coordTables.append( int(sColumn.get()) )
    return coordTables


print( configTables() )
windowTk.mainloop()

我希望我的要求是可以理解的,所以您可以帮助我。

谢谢

LoneRetrievr

更新:我尝试了以下代码,并且可以运行,但是窗口中没有任何内容(tkinter的窗口保持白色)。

from tkinter import *

windowTk = Tk()
pwMain = PanedWindow(windowTk, orient=VERTICAL)
pwTop = PanedWindow(pwMain, orient=HORIZONTAL)

lines = IntVar(windowTk, value=0)
columns = IntVar(windowTk, value=0)

def configTables() :

    sLine = Spinbox(pwTop, from_=0, to=15, textvariable=lines)
    pwTop.add( Label(pwTop, text = "Combien y a-t-il de lignes de tables ?") )
    pwTop.add( sLine )

    sColumn = Spinbox(pwTop, from_=0, to=15, textvariable=columns)
    pwTop.add( Label(pwTop, text = "Combien y a-t-il de colonnes de tables ?") )
    pwTop.add( sColumn )

    pwTop.pack()
    pwMain.pack()

numberLines = lines.get()
numberColumns = columns.get()
print( numberLines, numberColumns )
windowTk.mainloop()

我知道它只会打印一次值,这就是我想要的。 你能帮助我吗 ?我认为这很简单,但是我找不到问题所在。

2 个答案:

答案 0 :(得分:0)

您可以使用IntVar将旋转框连接到Python变量。我用一个例子扩展了您的程序。它添加了一个按钮以打印旋转框的当前值:

from tkinter import *

windowTk = Tk()
pwMain = PanedWindow(windowTk, orient=VERTICAL)
pwTop = PanedWindow(pwMain, orient=HORIZONTAL)
lignes = IntVar(windowTk, value=0)
colonnes = IntVar(windowTk, value=0)

def print_vars():
    print(lignes.get(), colonnes.get())

def configTables() :

    sLine = Spinbox(pwTop, from_=0, to=15, textvariable=lignes)
    pwTop.add( Label(pwTop, text = "Combien y a-t-il de lignes de table ?") )
    pwTop.add( sLine )

    sColumn = Spinbox(pwTop, from_=0, to=15, textvariable=colonnes)
    pwTop.add( Label(pwTop, text = "Combien y a-t-il de colonnes de tables ?") )
    pwTop.add( sColumn )

    pwTop.pack()

    b = Button(pwMain, text='print', command=print_vars)
    b.pack(side=BOTTOM)

    pwMain.pack()

    global coordTables
    coordTables = []
    coordTables.append( int(sLine.get()) )
    coordTables.append( int(sColumn.get()) )
    return coordTables


print( configTables() )
windowTk.mainloop()

注意,我没有删除不再需要的东西,例如coordTables变量和return语句。

答案 1 :(得分:0)

我相信这是您想要做的。

我建议您采用一种面向对象的方法。

Tkinter具有非常强大的IntVar()和其他变量。

import tkinter as tk

class App(tk.Frame):

def __init__(self,):

    super().__init__()

    self.master.title("Hello World")
    self.lines = tk.IntVar()
    self.columns = tk.IntVar()
    self.coordTables = []
    self.init_ui()

def init_ui(self):

    self.pack(fill=tk.BOTH, expand=1,)

    f = tk.Frame()

    tk.Label(f, text = "Combien y a-t-il de lignes de tables ?").pack()
    tk.Spinbox(f, from_=0, to=15, textvariable= self.lines).pack()

    tk.Label(f, text = "Combien y a-t-il de colonnes de tables ?").pack()
    tk.Spinbox(f, from_=0, to=15, textvariable= self.columns).pack()

    w = tk.Frame()

    tk.Button(w, text="Print", command=self.on_callback).pack()
    tk.Button(w, text="Reset", command=self.on_reset).pack()
    tk.Button(w, text="Close", command=self.on_close).pack()

    f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0)
    w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0)


def on_callback(self,):
    args = (self.lines.get(),self.columns.get())
    self.coordTables.append(args)

    print ("Numers of coords: {0}".format(len(self.coordTables)))

    for e,i in self.coordTables:
        print(e,i)

def on_reset(self):
    self.lines.set(0)
    self.columns.set(0)
    self.coordTables = []

def on_close(self):
    self.master.destroy()

if name == 'main':

app = App() app.mainloop()