【发布时间】:2013-05-13 21:53:40
【问题描述】:
我是编程、Python、这个网站的新手,并且实际上一般都在使用这些类型的网站,所以请听我说。
我一直在使用 tkinter 模块和 ttk 模块为一个更大的程序编写一个模块,当我将自己的模块导入主程序时,由于某种原因,没有一个 ttk 的东西可以正常工作。我的意思是,它出现了,但是我为它编写的样式(s=ttk.Style(); s.configure...等)无论如何都不会改变它。当我自己运行模块时,一切正常。当它被导入主程序时,它只是没有。
不仅如此,而且在使用输入框时,我才刚刚发现我被告知使用它们的方式,例如,var=StringVar() 作为文本变量(当模块自行运行),现在在调用 var.get() 时将变量 var 保留为空。现在我已经通过删除所有提到 StringVar() 来对此进行排序(希望我知道这些实际上是多么多余),但我仍然想知道为什么将它们导入主程序会导致它们出现如此严重的故障.我会给你一些示例代码,但是我很难有足够的选择性......
如果您能提供任何指导,我将不胜感激。
编辑:给你这样的东西会有帮助吗?
stackoverflowmodule.py
import sys
from tkinter import *
from tkinter import ttk
import time
from random import randint, choice
class Decimals():
def Question1(self):
DECFrame.destroy()
frame1=ttk.Frame(DECmaster, height=height, width=width, style="NewFrame.TFrame")
frame1.pack()
Q1Label=ttk.Label(frame1, text="Question 1:", style="TitleLabel.TLabel")
Q1Label.grid(column=0, row=0, pady=(50,0))
answer=StringVar()
entry1=ttk.Entry(frame1, textvariable=answer)
entry1.grid(column=0, row=1, pady=(200,0))
# Typing in Hello should give a correct answer.
def Question1Attempt():
attempt=answer.get()
if attempt!="Hello":
print("Incorrect")
else:
print("Correct")
button=ttk.Button(frame1, text="Ok", command=Question1Attempt)
button.grid(column=0, row=2, pady=(30,0))
def Start():
global DECmaster
global s
global DECFrame
global DEC
global width
global height
DECmaster = Tk()
width=str(1000)
height=str(800)
x1=str(0)
y1=str(0)
DECmaster.geometry(width+"x"+height+"+"+x1+"+"+y1)
DECmaster.configure(bg="#8afff0")
s=ttk.Style()
s.configure("NewFrame.TFrame", background="#8afff0")
s.configure("TitleLabel.TLabel", foreground= "blue", background="#8afff0")
DECFrame=ttk.Frame(DECmaster, style="NewFrame.TFrame")
DECFrame.pack()
TitleLabel=ttk.Label(DECFrame, text="Test for Decimals", style="TitleLabel.TLabel")
TitleLabel.grid(column=1, row=0, pady=(50,0), sticky=N)
DEC=Decimals()
button=ttk.Button(DECFrame, text="Start", command=DEC.Question1)
button.grid(column=2, row=2, pady=(200,0), sticky=N)
DECmaster.mainloop()
stackoverflowprogram.py
from tkinter import *
from tkinter import ttk
import time
import stackoverflowmodule
root = Tk()
width=str(1000)
height=str(800)
x1=str(0)
y1=str(0)
##width=str(1228)
##height=str(690)
##x1=str(-1)
##y1=str(-22)
root.geometry(width+"x"+height+"+"+x1+"+"+y1)
root.configure(bg="#8afff0")
s=ttk.Style()
s.configure("NewFrame.TFrame", background="#8afff0")
s.configure("TitleLabel.TLabel", foreground= "blue", background="#8afff0")
Testframe=ttk.Frame(root, height=height, width=width, style="NewFrame.TFrame")
Testframe.pack()
Titlelabel=ttk.Label(Testframe, text="Start Test:", style="TitleLabel.TLabel")
Titlelabel.grid(column=0, row=0, pady=(50,0))
def StartTest():
stackoverflowmodule.Start()
button=ttk.Button(Testframe, text="Start", command=StartTest)
button.grid(column=0, row=1, pady=(100,0))
root.mainloop()
我意识到那里有很多东西,但如果没有这一切,我就无法真正证明我的观点。再次感谢。
【问题讨论】:
-
没有看到任何代码,很难确定,但我的第一个猜测是您正在模块中创建一个
tkinter.Tk对象,并在导入它的脚本中创建另一个对象。如果是这样,您的一半代码将无法正常工作(因为它使用Tk而没有mainloop),或者您的一半代码甚至无法运行(因为另一个的mainloop不会返回直到你退出)。 -
更重要的是:请提供足以证明问题的模块和程序的stripped-down example 源代码。
-
啊哈...这听起来很熟悉...有什么替代方案?
-
哦,好吧...谢谢你,正如我所说,这一切都是新手,所以感谢指针。
-
无论是模块还是脚本都必须是 Tk 术语中的“主应用程序”。让我写一个给出例子的答案。