当我运行以下代码时,有时条目具有我希望它默认拥有的值,有时它不会。每次我运行它一切都差不多但结果却不一样!有人请帮我找到发生的事情!
这是我的代码:
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)
答案 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()