我的程序中有两个用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()
我知道它只会打印一次值,这就是我想要的。 你能帮助我吗 ?我认为这很简单,但是我找不到问题所在。
答案 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 tkclass 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()