python - 为什么 tkinter 行为随机?

python - Why is tkinter behaving randomly?

当我 运行 下面的代码时,有时条目具有我希望它默认具有的值,有时却没有。每次我 运行 一切都差不多,但结果不同!有人请帮我看看这是怎么回事!

这是我的代码:

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)

玩弄它,这是我的理论:

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 的缩写。如果您为 Entry 指定两者,它将选择一个而忽略另一个。我怀疑选择取决于关键字参数 dict 迭代的顺序。也许最后迭代的那个是对条目用作其文本变量的最终决定权的那个。对于 Python 的大多数版本,字典的迭代顺序是不确定的,因此您可以预期在多次执行相同代码时会产生不同的结果。 (不过,在 3.6 及更高版本中,行为应该保持一致,因为字典迭代顺序在该版本中变得一致)

我建议通过将 "Please enter the root directory" 文本放在单独的标签小部件中来解决此冲突:

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()

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

如果您使用 text="Please enter the root..." 的目标是创建提示,除了 Entry 小部件之外,您还需要使用 Label 小部件。如果您的目标是插入该字符串作为 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"