【问题标题】:Scale function not outputting number to variable?缩放功能不将数字输出到变量?
【发布时间】:2016-04-18 16:15:25
【问题描述】:

所以由于某种原因,tkinter 中的 scale 函数不想在比例上输出数字。我收到的只是 0.0 或什么都没有。它似乎与 GUI 和通过 GUI 调用函数有关。在 python 3.4 中编写和运行。

from tkinter import *
from tkinter import ttk
from tkinter import messagebox

iterations=30

def settings():
    global itervar, iterscale
    sGui = Tk()
    itervar = DoubleVar()

    iterscale = Scale(sGui, orient="horizontal", from_=1, to=1000, variable=itervar)
    iterscale.pack()

    iterbutton = Button(sGui, text="Save Settings", command=saveSettings)
    iterbutton.pack()

    sGui.mainloop()

def saveSettings():
    global iterations
    iterations = itervar.get()
    print(iterations)

def doNothing():
    pass

def main():
    global root, version
    root= Tk()

    menu = Menu(root)
    root.config(menu=menu)

    fileMenu = Menu(menu)
    menu.add_cascade(label="File", menu=fileMenu)
    fileMenu.add_command(label="Quit", command=quit)

    benchmarkMenu = Menu(menu)
    menu.add_cascade(label="Benchmark", menu=benchmarkMenu)
    benchmarkMenu.add_command(label="Run [All]", command=doNothing)
    benchmarkMenu.add_separator()
    benchmarkMenu.add_command(label="Settings", command=settings)

    root.mainloop()

#Main
main()

我自己尝试了 settingssaveSettings 函数,它们工作正常,但是当我通过 GUI 调用它时,它似乎不起作用。

关于这个问题的任何想法,我唯一的解决方案是将 settings 函数和 saveSettings 函数放在不同的文件中,然后使用 os.startfile("etc...") 在外部运行该文件

【问题讨论】:

  • 为什么在settings函数中调用sGui.mainloop()
  • 这样设置窗口在运行时保持打开状态?!?!
  • .... 哦,这是另一个 Tk 实例... 好的,您需要将其更改为 Toplevel 以便它将作为主程序的另一个窗口存在。
  • topmost 只允许窗口停留在主 GUI 前面
  • FWIW,一个程序中的根Tk() 窗口不能超过一个,mainloop 调用不能超过一个。

标签: python tkinter global-variables scrollbar


【解决方案1】:

最小修复:改变这个

itervar = DoubleVar()

到这里:

itervar = DoubleVar(sGui)

因为您有两个根应用程序(rootsGui 都是 Tk 的实例),所以 itervar 的隐含父小部件是第一个创建的,是 root,因此当您指定时 tkinter 会感到困惑它作为一个完全不同的应用程序的变量。

但我会强烈建议使用Toplevel 实例来将窗口保留为同一程序的一部分:

sGui = Toplevel(root)
...
#sGui.mainloop() #no longer need this

虽然如果您希望能够在没有主窗口的情况下运行设置窗口,您可以考虑将所有可见窗口设置为Toplevels 并隐藏实际的根:

                # I'm not sure if you want to call it this
abs_root = Tk() # but you are already using root
abs_root.withdraw() #hide the window

然后制作root = Toplevel(abs_root)


您可以直接使用 .geting 来逐步淘汰变量:

iterations = iterscale.get()

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 2012-09-12
    • 2012-08-25
    • 2020-01-13
    • 2015-08-24
    • 1970-01-01
    • 2018-03-15
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多