Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从其他Tkinter程序调用时不显示标签_Python_Tkinter - Fatal编程技术网

Python 从其他Tkinter程序调用时不显示标签

Python 从其他Tkinter程序调用时不显示标签,python,tkinter,Python,Tkinter,我写了一个有起始页的程序,还有两个从起始页调用的程序。这两个子程序都是自己工作的。然而,当我把它们放进我的起始页时,秒表计时标签并没有显示出来。如果您想知道,我会通过以下方式将它们放入我的程序中: import program program.function() 这是我的起始页程序: from Tkinter import * class start_page: def __init__(self,master): self.master = master

我写了一个有起始页的程序,还有两个从起始页调用的程序。这两个子程序都是自己工作的。然而,当我把它们放进我的起始页时,秒表计时标签并没有显示出来。如果您想知道,我会通过以下方式将它们放入我的程序中:

import program
program.function()
这是我的起始页程序:

from Tkinter import *
class start_page:
    def __init__(self,master):
        self.master = master
        self.frame = Frame(self.master)
        self.countdown = Button(master, text = "Timer", command = self.c).pack()
        self.stopwatch_butt = Button(master,text="Stopwatch",command=self.g).pack()
    def g(self):
        import stopwatch
        stopwatch.f()
    def c(self):
        import timer_prog
        timer_prog.timer()
        self.master.after_cancel(timer_prog)
def main():
    root = Tk()
    s = start_page(root)
    root.title("Timer Suite: Brian Ton")
    root.mainloop()
main()
如果我运行这个程序,计时器程序工作正常,但是秒表不显示它的标签,只显示它的按钮。我尝试在函数之后清除所有Tk,但没有成功,我还尝试先运行秒表程序,但没有成功。

这是我的秒表程序:

from Tkinter import *
import datetime

def s():
    start.config(state='disabled')
    stop.config(state="normal")
    reset.config(state='disabled')
    Start()
def Start():
    if reset['state'] == 'disabled' and stop['state'] == 'normal':
        hidden.set(str(int(hidden.get())+1))
        root.update()
        root.after(1000,Start)
        curr = hidden.get()
        g.set(str(datetime.timedelta(seconds=int(curr))))
        print g.get()
    else:
        return None
def Stop():
    start.config(state='disabled')
    stop.config(state='disabled')
    reset.config(state="normal")
def Reset():
    start.config(state="normal")
    stop.config(state="disabled")
    reset.config(state='disabled')
    hidden.set('0')
    g.set(str(datetime.timedelta(seconds=0)))
def f():
    global root,frame,master,hidden,g,timelabel,start,stop,reset
    root = Tk()
    frame = Frame(root)
    master = root
    hidden = StringVar()
    g = StringVar()
    hidden.set('0')
    timelabel = Label(master,textvariable=g)
    g.set(str(datetime.timedelta(seconds=int(0))))
    timelabel.grid(row=1,column=2)
    start = Button(master,text="Start",command = s,state="normal")
    stop = Button(master,text="Stop",command = Stop,state = "disabled")
    reset = Button(master,text="Reset",command = Reset,state = "disabled")
    start.grid(row=2,column=1)
    stop.grid(row=2,column=2)
    reset.grid(row=2,column=3)
    root.update()
    root.mainloop()

这是我的定时器程序:

from Tkinter import *
import datetime

def get_seconds(h,m,s):
    hr_sec = h * 3600
    m_sec = m * 60
    return hr_sec+m_sec+s
def timerstartstop():
    hours = hour_entry.get()
    minutes = minute_entry.get()
    sec = second_entry.get()
    if hours == "":
        hours = 0
        hour_entry.insert(0,"0")
    if minutes == "":
        minutes = 0
        minute_entry.insert(0,"0")
    if sec == "":
        sec = 0
        second_entry.insert(0,"0")
    c = get_seconds(int(hours), int(minutes), int(sec))
    global s
    s = StringVar(master)
    s.set(c)
    if startstop['text'] == 'Stop':
        global curr
        curr = shown
        s.set(-1)
    if startstop['text'] == 'Reset':
        startstop.config(text="Start")
        s.set(c)
        root.update()
        shown.set(str(datetime.timedelta(seconds=int(s.get()))))
        return None
    countdown()
import winsound
def countdown():
    startstop.config(text="Stop")
    global shown
    good = True
    shown = StringVar(master)
    shown.set(str(datetime.timedelta(seconds=int(s.get()))))
    L = Label(master,textvariable=shown).grid(row=1,column=2)
    if int(s.get()) == 0:
        startstop.config(text="Reset")
        while startstop['text'] != "Start":
            root.update()
            winsound.Beep(500,500)
    elif int(s.get()) < 0:
        good = False
        shown.set(curr.get())
        startstop.config(text="Reset")
    else:
        if good:
            s.set(str(int(s.get())-1))
            root.after(1000,countdown)
def ex():
    root.after_cancel(countdown)
    root.destroy()
def timer():
    global root
    global master
    global frame
    root = Tk()
    master = root
    frame = Frame(master)
    global hour_entry
    hour_entry = Entry(master,width=3)
    hour_entry.grid(row=0,column=0)
    colon_l = Label(master,text=':').grid(row=0,column=1)
    global minute_entry
    minute_entry = Entry(master,width=2)
    minute_entry.grid(row=0,column=2)
    colon_l2 = Label(master,text=':').grid(row=0,column=3)
    global second_entry
    second_entry = Entry(master,width=2)
    second_entry.grid(row=0,column=4)
    global startstop
    startstop = Button(master,text="Start",command=timerstartstop)
    e = Button(master,text="Exit",command=ex).grid(row=1,column=3)
    startstop.grid(row=0,column=5)
    root.mainloop()
附件是stopwatch程序的一些屏幕截图,这些截图显示了stopwatch程序在启动程序调用时的外观


注意:我可以从起始页判断程序正在运行,因为它每秒打印当前时间。另外,我附上了一些截图



Tkinter
程序应仅使用一个
Tk()
-来创建主窗口,使用一个
mainloop()
-来控制所有窗口和小部件。如果使用两个
Tk()
和两个
mainloop()
,则它有问题-例如
get()/set()
可能无法工作

子窗口应该使用
Toplevel()
而不是
Tk()

启动程序的函数(即
run()
)可以使用参数
window
def run(window)
)运行,然后您可以使用

root = Tk()
run(root)
root.mainloop()
或者在导入之后

run(Toplevel())
(不带
maniloop()

您可以使用
if\uuuuu name\uuuu==“\uuuuu main\uuuu”
来识别程序是否以独立方式启动

范例

main.py

from Tkinter import *

class StartPage:

    def __init__(self, master):
        self.master = master
        master.title("Timer Suite: Brian Ton")
        Button(master, text="Timer", command=self.run_timer).pack()
        Button(master, text="Stopwatch", command=self.run_stopwatch).pack()

    def run_stopwatch(self):
        import stopwatch
        window = Toplevel()
        stopwatch.run(window)

    def run_timer(self):
        import timer_prog
        window = Toplevel()
        timer_prog.timer(window)
        self.master.after_cancel(timer_prog)

def main():
    root = Tk()
    StartPage(root)
    root.mainloop()

main()
from Tkinter import *
import datetime

def pre_start():
    start_button.config(state='disabled')
    stop_button.config(state='normal')
    reset_button.config(state='disabled')
    start()

def start():
    global current_time

    # stop_button['state'] can be 'normal' or 'active' so better use ` != 'disabled'`
    if reset_button['state'] == 'disabled' and stop_button['state'] != 'disabled':
        current_time += 1
        time_var.set(str(datetime.timedelta(seconds=current_time)))
        print(time_var.get())
        master.after(1000, start)

def stop():
    start_button.config(state='disabled')
    stop_button.config(state='disabled')
    reset_button.config(state='normal')

def reset():
    global current_time

    start_button.config(state='normal')
    stop_button.config(state='disabled')
    reset_button.config(state='disabled')
    current_time = 0
    time_var.set(str(datetime.timedelta(seconds=0)))

def run(window):
    global master
    global current_time, time_var
    global start_button, stop_button, reset_button

    master = window
    current_time = 0

    time_var = StringVar()
    time_var.set(str(datetime.timedelta(seconds=0)))

    time_label = Label(window, textvariable=time_var)
    time_label.grid(row=1, column=2)

    start_button = Button(master, text='Start', command=pre_start, state='normal')
    stop_button  = Button(master, text='Stop',  command=stop,      state='disabled')
    reset_button = Button(master, text='Reset', command=reset,     state='disabled')
    start_button.grid(row=2, column=1)
    stop_button.grid(row=2, column=2)
    reset_button.grid(row=2, column=3)

if __name__ == '__main__':
    # it runs only in standalone program
    root = Tk()    
    run(root)
    root.mainloop()
秒表.py

from Tkinter import *

class StartPage:

    def __init__(self, master):
        self.master = master
        master.title("Timer Suite: Brian Ton")
        Button(master, text="Timer", command=self.run_timer).pack()
        Button(master, text="Stopwatch", command=self.run_stopwatch).pack()

    def run_stopwatch(self):
        import stopwatch
        window = Toplevel()
        stopwatch.run(window)

    def run_timer(self):
        import timer_prog
        window = Toplevel()
        timer_prog.timer(window)
        self.master.after_cancel(timer_prog)

def main():
    root = Tk()
    StartPage(root)
    root.mainloop()

main()
from Tkinter import *
import datetime

def pre_start():
    start_button.config(state='disabled')
    stop_button.config(state='normal')
    reset_button.config(state='disabled')
    start()

def start():
    global current_time

    # stop_button['state'] can be 'normal' or 'active' so better use ` != 'disabled'`
    if reset_button['state'] == 'disabled' and stop_button['state'] != 'disabled':
        current_time += 1
        time_var.set(str(datetime.timedelta(seconds=current_time)))
        print(time_var.get())
        master.after(1000, start)

def stop():
    start_button.config(state='disabled')
    stop_button.config(state='disabled')
    reset_button.config(state='normal')

def reset():
    global current_time

    start_button.config(state='normal')
    stop_button.config(state='disabled')
    reset_button.config(state='disabled')
    current_time = 0
    time_var.set(str(datetime.timedelta(seconds=0)))

def run(window):
    global master
    global current_time, time_var
    global start_button, stop_button, reset_button

    master = window
    current_time = 0

    time_var = StringVar()
    time_var.set(str(datetime.timedelta(seconds=0)))

    time_label = Label(window, textvariable=time_var)
    time_label.grid(row=1, column=2)

    start_button = Button(master, text='Start', command=pre_start, state='normal')
    stop_button  = Button(master, text='Stop',  command=stop,      state='disabled')
    reset_button = Button(master, text='Reset', command=reset,     state='disabled')
    start_button.grid(row=2, column=1)
    stop_button.grid(row=2, column=2)
    reset_button.grid(row=2, column=3)

if __name__ == '__main__':
    # it runs only in standalone program
    root = Tk()    
    run(root)
    root.mainloop()

tkinter
程序应仅使用一个
Tk()
(主窗口)和一个
mainloop()
。您运行了许多
Tk()
mainloop()
,所以它可能会产生问题。主程序应使用
Tk()
mainloop()
,其他程序应使用
Toplevel()
而不使用
mainloop()
,然后作为主程序的一部分运行。只有在作为独立程序运行时,它们才应该使用
Tk()
mainloop()
。顺便说一下:如果作为独立程序运行时,
可以使用
,而导入时则为false。谢谢,我以前这样做过,但是这次我就是找不到错误。