python - 为什么tkinter随机行为?

时间:2017-09-25 14:06:20

标签: python tkinter binding timing

当我运行以下代码时,有时条目具有我希望它默认拥有的值,有时它不会。每次我运行它一切都差不多但结果却不一样!有人请帮我找到发生的事情!

这是我的代码:

from settings import Settings
from tkinter import *
root = Tk()
settings = Settings(root, "Z:\my files\projects\programing\python\courseAssist\Courses")

parent_directory = Entry(
    root,
    width=60,
    textvariable=settings.parent_directory_var,
    text="Please enter the root directory for all the files and directories to be saved and created in."
)
parent_directory.pack()
mainloop()

以下是设置文件中的代码:

from tkinter import *
class Settings:
    def __init__(self, root, parent_directory):
        self.parent_directory_var = StringVar(root, value=parent_directory)

2 个答案:

答案 0 :(得分:2)

至少部分问题在于您使用textvariable=...后跟text=...Entry窗口小部件没有text属性;在此上下文中,text只是textvariable的简写。在tkinter中,如果指定两次相同的选项,则使用最后一个选项。因此,您的代码与Entry(...,textvariable="Please enter the root...", ...)相同。

如果你的目标是text="Please enter the root..."是创建提示,除了Label小部件之外,您还需要使用Entry小部件。如果您的目标是将该字符串作为Entry小部件的值插入,则可以调用变量的set方法(例如:settings.parent_directory_var.set("Please enter the root..."))。

另外,您是否知道普通字符串中的反斜杠是转义字符?您需要使用原始字符串,双反斜杠或正斜杠(是的,正斜杠在Windows路径中有效)

例如,所有这三个都是等价的:

  • "Z:\\my files\\projects\\programing\\python\\courseAssist\\Courses"
  • "Z:/my files/projects/programing/python/courseAssist/Courses"
  • r"Z:\my files\projects\programing\python\courseAssist\Courses"

答案 1 :(得分:1)

玩弄它,这是我的理论:

parent_directory = Entry(
    root,
    width=60,
    textvariable=settings.parent_directory_var,
    text="Please enter the root directory for all the files and directories to be saved and created in."
)

在Entry构造函数的上下文中,text仅仅是textvariable的缩写。如果为条目指定两者,它将选择一个而忽略另一个。我怀疑选择取决于关键字参数dict迭代的顺序。也许最后一个迭代的是那个在条目用作文本变量时最终说出的那个。对于大多数Python版本,字典的迭代顺序不是确定性的,因此您可以预期这会对同一代码的多次执行产生不同的结果。 (但在3.6及以上版本中,行为应保持一致,因为字典迭代顺序在该版本中变得一致)

我建议通过在单独的标签小部件中添加“请输入根目录”文本来解决此冲突:

root = Tk()
settings = Settings(root, "Z:\my files\projects\programing\python\courseAssist\Courses")

instructions = Label(
    root,
    text = "Please enter the root directory for all the files and directories to be saved and created in."
)
instructions.pack()

parent_directory = Entry(
    root,
    width=60,
    textvariable=settings.parent_directory_var,
)
parent_directory.pack()
mainloop()