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