精华内容
下载资源
问答
  • tkinter关闭窗口后程序并未退出:检查这时共有7个线程。 threading.active_count() 7 threading.current_thread() <_MainThread(MainThread, started 140695305631552)> threading.enumerate() [<_Main...

    tkinter关闭窗口后程序并未退出:检查这时共有7个线程。

    threading.active_count()
    7
    threading.current_thread()
    <_MainThread(MainThread, started 140695305631552)>
    threading.enumerate()
    [<_MainThread(MainThr...05631552)>, <WriterThread(pydevd...75284224)>, <ReaderThread(pydevd...66891520)>, <_TimeoutThread(Thre...58498816)>, <PyDBCommandThread(p...49843968)>, <CheckAliveThread(py...41451264)>, <Thread(Thread-7, st...61450496)>]
    special variables:
    function variables:
    0: <_MainThread(MainThread, started 140695305631552)>
    1: <WriterThread(pydevd.Writer, started daemon 140695275284224)>
    2: <ReaderThread(pydevd.Reader, started daemon 140695266891520)>
    3: <_TimeoutThread(Thread-4, started daemon 140695258498816)>
    4: <PyDBCommandThread(pydevd.CommandThread, started daemon 140695249843968)>
    5: <CheckAliveThread(pydevd.CheckAliveThread, started 140695241451264)>
    6: <Thread(Thread-7, started 140692661450496)>
    special variables:
    function variables:
    additional_info: <_pydevd_bundle.pydevd_cython.PyDBAdditionalThreadInfo object at 0x7ff590656580>
    daemon: False
    ident: 140692661450496
    name: 'Thread-7'
    native_id: 6254
    stop_reason: 105
    _args: ()
    _bootstrap: <bound method Thread._bootstrap of <Thread(Thread-7, started 140692661450496)>>
    _bootstrap_inner: <bound method Thread._bootstrap_inner of <Thread(Thread-7, started 140692661450496)>>
    _daemonic: False
    _delete: <bound method Thread._delete of <Thread(Thread-7, started 140692661450496)>>
    _ident: 140692661450496
    _initialized: True
    _invoke_excepthook: <function _make_invoke_excepthook.<locals>.invoke_excepthook at 0x7ff590404a60>
    _is_stopped: False
    _kwargs: {}
    _name: 'Thread-7'
    _native_id: 6254
    _reset_internal_locks: <bound method Thread._reset_internal_locks of <Thread(Thread-7, started 140692661450496)>>
    _set_ident: <bound method Thread._set_ident of <Thread(Thread-7, started 140692661450496)>>
    _set_native_id: <bound method Thread._set_native_id of <Thread(Thread-7, started 140692661450496)>>
    _set_tstate_lock: <bound method Thread._set_tstate_lock of <Thread(Thread-7, started 140692661450496)>>
    _started: <threading.Event object at 0x7ff590413250>
    _stderr: <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>
    _stop: <bound method Thread._stop of <Thread(Thread-7, started 140692661450496)>>
    _target: <bound method TrainGUI.printTrainLog of <__main__.TrainGUI object .>>
    _tstate_lock: <locked _thread.lock object at 0x7ff6284e9cc0>
    _wait_for_tstate_lock: <bound method Thread._wait_for_tstate_lock of <Thread(Thread-7, started 140692661450496)>>
    len(): 7
    
    

    在tkinter退出窗口后,走完最后一条程序代码,发现终端并没有退出,仍在运行,这时在vs code的调试模式下点暂停,
    在这里插入图片描述
    发现他在调用这个函数!我回头去看,发现这个函数有while True,我单独给他设置了一个线程,这显然会导致他无限运行下去。
    改完后正常了。
    启示:tkinter没有问题,找自己代码的原因。每次运行风扇都嗡嗡叫,早应该意识到这点。

    展开全文
  • def main(): root = Tk() b = Button(root, text='退出', command=root.quit) b.pack() mainloop() if __name__ == '__main__': main() result reference [文档] docs.python.org/3/library/tkinter.html resource ...

    Python : 3.7.0

    OS : Ubuntu 18.04.1 LTS

    IDE : PyCharm 2018.2.4

    Conda : 4.5.11

    typesetting : Markdown

    code

    """

    @Author : 行初心

    @Date : 18-10-1

    @Blog : www.cnblogs.com/xingchuxin

    @Gitee : gitee.com/zhichengjiu

    """

    from tkinter import *

    def main():

    root = Tk()

    b = Button(root, text='退出', command=root.quit)

    b.pack()

    mainloop()

    if __name__ == '__main__':

    main()

    result

    reference

    [文档] docs.python.org/3/library/tkinter.html

    resource

    [文档] docs.python.org/3

    [规范] www.python.org/dev/peps/pep-0008

    [规范] zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules

    [源码] www.python.org/downloads/source

    [ PEP ] www.python.org/dev/peps

    [平台] www.cnblogs.com

    [平台] gitee.com

    Python具有开源、跨平台、解释型和交互式等特性,值得学习。

    Python的设计哲学:优雅,明确,简单。提倡用一种方法,最好是只有一种方法来做一件事。

    GUI可以选择PyQt5、PySide2、wxPython、PyGObject、wxWidgets等进行创作。

    代码的书写要遵守规范,这样有助于沟通和理解。

    每种语言都有独特的思想,初学者需要转变思维、踏实践行、坚持积累。

    展开全文
  • 为了寻找为我的程序创建进度条,我发现使用tkinter很难做到。为了完成创建进度条而不进入可怕的"mainloop",我选择使用线程从进度条中创建一个类。通过大量的试验错误,我发现由于使用多线程(tkinter喜欢在主线程中)...

    我发布这个是因为我自己一直在努力寻找这个问题的明确答案。 。 。

    为了寻找为我的程序创建进度条,我发现使用tkinter很难做到。为了完成创建进度条而不进入可怕的"mainloop",我选择使用线程从进度条中创建一个类。通过大量的试验错误,我发现由于使用多线程(tkinter喜欢在主线程中),没有太多可以定制的。以下是我尝试过的两个选项,其次是最符合我需求的第三个选项:

    选项1:使用回调函数

    给出以下代码:

    import tkinter as tk

    import tkinter.ttk as ttk

    import threading

    class ProgressbarApp(threading.Thread):

    def __init__(self, max_value: int):

    self.max_value = max_value

    self.root = None

    self.pb = None

    threading.Thread.__init__(self)

    self.lock = threading.Lock()    # (1)

    self.lock.acquire()             # (2)

    self.start()

    # (1) Makes sure progressbar is fully loaded before executing anything

    with self.lock:

    return

    def close(self):

    self.root.quit()

    def run(self):

    self.root = tk.Tk()

    self.root.protocol("WM_DELETE_WINDOW", self.__callback)

    self.pb = ttk.Progressbar(self.root, orient='horizontal', length=400, mode='determinate')

    self.pb['value'] = 0

    self.pb['maximum'] = self.max_value

    self.pb.pack()

    self.lock.release()             # (2) Will release lock when finished

    self.root.mainloop()

    def update(self, value: int):

    self.pb['value'] = value

    @staticmethod

    def __callback():

    return

    if __name__ == '__main__':

    interval = 100000

    my_pb = ProgressbarApp(interval)

    for i in range(interval):

    my_pb.update(i)

    my_pb.close()

    # Other stuff goes on . . .

    哪里

    self.root.protocol("WM_DELETE_WINDOW", self.__callback)

    防止窗口关闭。但是,如果要按住"退出"或[X]按钮,进度条将冻结,直到用户释放按钮。 (不断调用__callback函数,防止其他任务完成)。

    选项2:使用root.overriderdirect(True)

    给出以下代码:

    import tkinter as tk

    import tkinter.ttk as ttk

    import threading

    class ProgressbarApp(threading.Thread):

    def __init__(self, max_value: int):

    self.max_value = max_value

    self.root = None

    self.pb = None

    threading.Thread.__init__(self)

    self.lock = threading.Lock()    # (1)

    self.lock.acquire()             # (2)

    self.start()

    # (1) Makes sure progressbar is fully loaded before executing anything

    with self.lock:

    return

    def close(self):

    self.root.quit()

    def run(self):

    self.root = tk.Tk()

    self.root.overrideredirect(True)

    self.pb = ttk.Progressbar(self.root, orient='horizontal', length=400, mode='determinate')

    self.pb['value'] = 0

    self.pb['maximum'] = self.max_value

    self.pb.pack()

    self.lock.release()             # (2) Will release lock when finished

    self.root.mainloop()

    def update(self, value: int):

    self.pb['value'] = value

    if __name__ == '__main__':

    interval = 100000

    my_pb = ProgressbarApp(interval)

    for i in range(interval):

    my_pb.update(i)

    my_pb.close()

    # Other stuff goes on . . .

    哪里

    self.root.overrideredirect(True)

    清除所有tkinters窗口选项。但是,进度条不仅位于奇数位置,而且还会遮挡用户窗口。进度条应该是用户友好的。

    选项3:使用root.attributes(' - disabled',True)

    给出以下代码:

    import tkinter as tk

    import tkinter.ttk as ttk

    import threading

    class ProgressbarApp(threading.Thread):

    def __init__(self, max_value: int):

    self.max_value = max_value

    self.root = None

    self.pb = None

    threading.Thread.__init__(self)

    self.lock = threading.Lock()    # (1)

    self.lock.acquire()             # (2)

    self.start()

    # (1) Makes sure progressbar is fully loaded before executing anything

    with self.lock:

    return

    def close(self):

    self.root.quit()

    def run(self):

    self.root = tk.Tk()

    self.root.attributes('-disabled', True)

    self.pb = ttk.Progressbar(self.root, orient='horizontal', length=400, mode='determinate')

    self.pb['value'] = 0

    self.pb['maximum'] = self.max_value

    self.pb.pack()

    self.lock.release()             # (2) Will release lock when finished

    self.root.mainloop()

    def update(self, value: int):

    self.pb['value'] = value

    if __name__ == '__main__':

    interval = 100000

    my_pb = ProgressbarApp(interval)

    for i in range(interval):

    my_pb.update(i)

    my_pb.close()

    # Other stuff goes on . . .

    哪里

    self.root.attributes('-disabled', True)

    阻止任何用户与窗口交互。这最适合我对这个程序的需求,因为它可以防止窗口关闭并且仍然具有漂亮的外观。 (我唯一的小问题是用户不能再最小化进度条或移动它)。

    如果有更好的解决方案,我很乐意看到它们。希望这对某人有所帮助。

    这看起来不是一个问题。 我不明白你在问什么。

    创建一个没有X(关闭)按钮的python tkinter窗口的可能重复

    另一种在Windows上实现此目的的方法:

    #!python3

    import tkinter as tk

    from tkinter import ttk

    import threading, time

    import tkinter as tk

    from ctypes import windll, wintypes

    GWL_STYLE = -16

    WS_CHILD = 0x40000000

    WS_SYSMENU = 0x00080000

    SWP_FRAMECHANGED = 0x0020

    SWP_NOACTIVATE = 0x0010

    SWP_NOMOVE = 0x0002

    SWP_NOSIZE = 0x0001

    # write short names for functions and specify argument and return types

    GetWindowLong = windll.user32.GetWindowLongW

    GetWindowLong.restype = wintypes.ULONG

    GetWindowLong.argtpes = (wintypes.HWND, wintypes.INT)

    SetWindowLong = windll.user32.SetWindowLongW

    SetWindowLong.restype = wintypes.ULONG

    SetWindowLong.argtpes = (wintypes.HWND, wintypes.INT, wintypes.ULONG)

    SetWindowPos = windll.user32.SetWindowPos

    class App(tk.Tk):

    def __init__(self):

    tk.Tk.__init__(self)

    self.pb = ttk.Progressbar(self, orient="horizontal", length=400, mode="determinate", maximum=100)

    self.pb.pack()

    tk.Button(self, text="Remove buttons", command=self.remove_buttons).pack()

    tk.Button(self, text="Add buttons", command=self.add_buttons).pack()

    def start(self):

    self.t = threading.Thread(target=self.loop)

    self.t.start()

    def loop(self):

    while True:

    for num in range(0, 100):

    self.pb['value']=num

    time.sleep(0.1)

    def _get_hwnd(self):

    w_id = self.winfo_id() # gets handle

    style = GetWindowLong(w_id, GWL_STYLE) # get existing style

    newstyle = style & ~WS_CHILD # remove child style

    res = SetWindowLong(w_id, GWL_STYLE, newstyle) # set new style

    res = SetWindowPos(w_id, 0, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)

    hwnd = int(self.wm_frame(), 16) # find handle of parent

    res = SetWindowLong(w_id, GWL_STYLE, style) # set back to old style

    res = SetWindowPos(w_id, 0, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)

    return hwnd # return parents handle

    def remove_buttons(self):

    hwnd = self._get_hwnd()

    style = GetWindowLong(hwnd, GWL_STYLE) # get existing style

    style = style & ~WS_SYSMENU

    res = SetWindowLong(hwnd, GWL_STYLE, style)

    res = SetWindowPos(hwnd, 0, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)

    def add_buttons(self):

    hwnd = self._get_hwnd()

    style = GetWindowLong(hwnd, GWL_STYLE) # get existing style

    style = style | WS_SYSMENU

    res = SetWindowLong(hwnd, GWL_STYLE, style)

    res = SetWindowPos(hwnd, 0, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)

    if __name__ =="__main__":

    app = App()

    app.start()

    app.mainloop()

    看起来很复杂,但似乎可行!

    它看起来很复杂,因为tkinter不能很好地使用windows api来获取父窗口的句柄,解决这个问题的方法是在_get_hwnd函数中,并且添加或删除按钮函数可以获得窗口的样式,因为它是,然后添加删除删除标题栏中所有按钮所需的样式,因为它修改了现在的样式,这应该适用于大多数窗口样式

    您可以创建一个仅使用pass来执行任何操作的函数。

    看看下面的内容:

    import tkinter as tk

    root=tk.Tk()

    def close_program():

    root.destroy()

    def disable_event():

    pass

    btn = tk.Button(root, text ="Click me to close", command = close_program)

    btn.pack()

    root.protocol("WM_DELETE_WINDOW", disable_event)

    root.mainloop()

    您还可以将root.overrideredirect(True)一起删除工具栏,以防止用户使用任何工具栏。 离开root.protocol("WM_DELETE_WINDOW", disable_event)也会阻止使用ALT + F4。

    import tkinter as tk

    root=tk.Tk()

    root.geometry("400x400")

    root.overrideredirect(True)

    def close_program():

    root.destroy()

    def disable_event():

    pass

    btn = tk.Button(root, text ="Click me to close", command = close_program)

    btn.pack()

    root.protocol("WM_DELETE_WINDOW", disable_event)

    root.mainloop()

    我不喜欢使用root.overrideredirect(True),因为在执行时窗口会卡在屏幕的左上角。但是,我将在root.protocol("WM_DELETE_WINDOW",disable_event)中尝试"传递"。我之前使用过返回。

    @JoshuaVanDeren:您可以使用overrideredirect(True),然后您可以创建自己的自定义工具栏。它有点工作,但非常可定制。

    编辑:使用传递仍然无法解决问题。当用户按下[X]时,进度条仍然被冻结@Sierra Mountain Tech您确定在进度条处于线程中时可以吗?我已经多次碰到一个问题,需要在主线程中。

    @JoshuaVanDeren:如果你可以创建一个Minimal,Complete和Verifiable示例,我可以测试一下,我可以提出一个可行的解决方案。

    当然可以。如果我有时间,我会举一个例子。

    我更新了主要问题。

    展开全文
  • 展开全部采用的是main函数对主窗口运行程序完毕自动关闭的命令:from tkinter import *def main():root = Tk()b = Button(root, text='退出', command=root.quit)b.pack()mainloop()if __name__ == '__main__':main...

    展开全部

    采用的是main函数对主窗口运行程序完毕自动关闭的命令:

    from tkinter import *def main():

    root = Tk()

    b = Button(root, text='退出', command=root.quit)

    b.pack()

    mainloop()if __name__ == '__main__':

    main()

    扩展资料:32313133353236313431303231363533e59b9ee7ad9431333431376533

    main函数的应用:

    程序执行的起点,main是相对来说的,如同音学理论之主调于泛音,泛音即程序中的除main之外的其他函数,迎合思考方式而生成的而非必定的模式。有主有次,执行起来条清缕析,既可将程序模块化又实现了一个闭合的整体。

    模块化程序设计方法是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来。

    利用函数可以实现程序的模块化,可以大大地减轻编码工作量。在函数内部或复合语句块内部定义的 auto 类型变量称为局部变量。

    局部变量的作用域从该局部变量定义的位置开始到本函数或复合语句结束处。局部变量的生存期较短暂。当局部变量所在的函数被调用时,局部变量内存空间被分配,函数调用结束后,局部变量内存空间被释放。

    函数的形参和实参均属于局部变量,调用函数时,形参内存空间被分配。函数调用结束后,形参内存空间被释放。C语言函数参数传递可分为三种情况:简单变量作为函数参数、数组名作为函数参数以及指针作为函数参数。

    展开全文
  • Tkinter 定时退出问题 查询了很多资料,大多数都是多线程使用延时调用 destroy 来实现的,这个是可以实现,但是如果你后面还需要重新创建窗口,就会出现问题,比如报错 如: 主线程不在主循环 无法调用image 命令,...
  • 我想制作一个简单的退出按钮,当按下该按钮时退出程序,因为我计划制作的GUI周围没有最小化,最大化或退出窗口框。 如果我添加这样的功能:def quit_program(self):self.destroy()然后将该函数放在sh...
  • 一般GUI的程序的关闭,都是使用者用鼠标去点击窗口右上角的那个X,不过我们也可以让窗口...不过,关闭root窗口的代码不能够在其它线程中执行,这样可以关闭窗口,但是程序无法正常退出。比如下面这段代码:import...
  • 在import time from Tkinter import * class Example: def __init__(self,master): self.startButton = Button(master,text='Start',command=self.start) self.startButton.grid(row=0,column=0) self.stopButton = ...
  • 我正在使用Tkinter和Python 2.7 . 该应用程序具有您期望的各种按钮,以及用于显示数字/结果的Entry和Label小部件 .我认为我的程序确实启动了mainloop,但关闭窗口并不会停止mainloop . 因为在添加后循环之前它确实...
  • 游戏打开了一个窗口,并添加了一些东西。然而,当运行游戏时,它会出现很短的时间并立即关闭。在我在这里找到了一些关于Stackoverflow的提示,可以在游戏结束时添加输入(“按下关闭窗口”)。事实上,这确保了窗口...
  • Tkinter 是 Python 的标准 GUI 库。...在pycharm 调试Tkinter程序的时候,关闭右上角的X 实际上并未退出进程,长期以往 再大的内存也会被耗尽。 一般就是下面的代码: from tkinter import * def main(): root = Tk
  • 但是,当我关闭VPython窗口时,所有其他窗口(我用Tkinter创建的)也会关闭,从而结束整个程序的进程。我已经试过了场景.退出=错误,但id似乎不起作用。在请有人帮帮我from Tkinter import *import Tkinter as tkfrom ...
  • def main(): root = Tk() b = Button(root, text='退出', command=root.quit) b.pack() mainloop() if __name__ == '__main__': main() result reference [文档] docs.python.org/3/library/tkinter.html resource ...
  • 如果它是一个线程,你可以使用低级线程(或Python 3中的_thread)模块...一个更干净的方法(取决于你的处理设置如何)将指示线程停止处理并使用实例变量退出,然后从主线程调用join()方法等待线程退出.例:class MyThre...
  • Python爬虫、数据分析、网站开发等案例教程视频免费在线观看 ...# True 只有退出按钮,也没有图标;False 正常的窗体样式 root.attributes("-toolwindow", True) 效果演示 3.设置全屏 .
  • 我有一个覆盆子皮与皮面适配器板。我做了一个图形用户界面来控制面板上的...我想添加一段代码,在单击“退出”按钮时关闭新窗口,然后返回主窗口。我查了很多例子,但就是看不清应该放什么,放在哪里。我试过“退...
  • 我有一个带有tkintergui的Python应用...如果我通过关闭根窗口上角的“X”退出应用程序,我的代码可以工作,但如果我从顶级菜单栏退出(即Python&gt;quit或Ctrl+Q),则代码不起作用。。因为大多数应用程序都使用...
  • 在pycharm 调试Tkinter程序的时候,关闭右上角的X 实际上并未退出进程,长期以往 再大的内存也会被耗尽。 一般就是下面的代码: """ from tkinter import * def main(): root = Tk() b = Button(root,...
  • 我在Python2.7中使用Tkinter。该应用程序有各种各样的按钮,以及显示数字/结果的条目和标签小部件。在我想我的程序确实启动了mainloop,但是关闭窗口并不能停止mainloop。因为在我添加after循环之前它的工作正常,...
  • 采用的是main函数对主窗口运行程序完毕自动关闭的命令:from tkinter import *def main():root = Tk()b = Button(root, text='退出', command=root.quit)b.pack()mainloop()if __name__ == '__main__':main()扩展...
  • 在我所做的是我创建了两个窗口,每个窗口都有一个输入窗口小部件和一个按钮小部件,如果你点击一个窗口的按钮,这个窗口就会被撤回,另一个窗口会弹出,如果你在那个弹出窗口中单击按钮,它就会退出,一个原始窗口就...
  • 重新审视一下前一篇文章中的代码:from tkinter import *# 构建主窗口main = Tk()# 构建标签Label(main, text='Hello Tkinter!').pack()# 构建退出按钮Button(main, text='Quit', command=main.quit).pack()# 执行主...
  • 从C语言开始,学习一门编程语言的第一步一般是编写一段HelloWorld...from tkinter import *# 构建主窗口main = Tk()# 构建标签Label(main, text='Hello Tkinter!').pack()# 构建退出按钮Button(main, text='Quit', c...
  • Python实验之Tkinter版猜数小游戏

    千次阅读 2020-11-26 15:27:25
    每次猜数之前要启动游戏并设置猜数范围和最大猜测次数等参数, 退出游戏时显示战绩(共玩几次, 猜对几次) 信息 代码实现: import random import tkinter import tkinter.messagebox import tkinter.simpledialog...
  • from tkinter import *# 构建主窗口main = Tk()# 构建标签Label(main, text='Hello Tkinter!').pack()# 构建退出按钮Button(main, text='Quit', command=main.quit).pack()# 执行主循环main.mainloop() 程序在构建...
  • import tkinter as tk top = tk.Tk() top.title('窗口标题')#设置窗口标题 top.geometry("400x100+500+200")#参数为宽x高+左上角x+y坐标 top.winfo_screenwidth()#返回屏幕宽度 top.winfo_screenheight()#返回屏幕...
  • from tkinter import * running = True def counting(): #定义Counting函数 global counter global running if running==True: counter += 1 digit.config(text=str(counter)) digit.after.

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

tkinter退出窗口