我对python中的sys.exit()感到很困惑.在python文档中,它说"退出Python"; 这是否意味着sys.exit()在python程序中调用时,进程将退出?如果是这样,下面的代码显示了不同的结果:
import sys
import time
import threading
def threadrun():
while(True):
time.sleep(1)
if __name__=="__main__":
t=threading.Thread(target=threadrun)
t.start()
sys.exit()
Run Code Online (Sandbox Code Playgroud)
在Linux中启动这个程序,结果不是python文档说的那个预期的,但仍然在系统中运行,那么sys.exit()真正做到了什么?
我为我的一个脚本创建了一个小GUI.一切都运作良好.
当我点击一个Button时,它会启动一个很大的功能,即从一些网站解析大量数据.
但是一旦我点击按钮,程序就会冻结,直到完全运行该功能.一切正常,但为什么我的GUI在执行函数期间冻结.我想打印一个小进度条,但这是不可能的.
这是该计划的一部分:
self.Button1 = Button(self.MENU, text="IELTS", command=self.My_Command)
self.Button1.grid(row=0, column=0,sticky=W+E)
def My_Command(self):
## HERE WE LAUNCH THE FUNCTION
Module_1.main() # My Big Function from another file
self.Button1.config(text="DONE")
Run Code Online (Sandbox Code Playgroud)
我无法在执行Module_1.main()时执行/打印任何内容...... GUI完全冻结.
Module_1.main()函数是一个线程解析器(解析来自两个网站的一些数据),一般需要2分钟才能运行.如果某人有想法在执行此功能所需的2分钟内能够与程序进行交互,那将非常有帮助.
我正在尝试将进度条连接到我的项目的功能.
这是我到目前为止,但我很确定它什么都不做:
def main():
pgBar.start()
function1()
function2()
function3()
function4()
pgBar.stop()
Run Code Online (Sandbox Code Playgroud)
以下是我创建进度条的代码,如果有帮助的话:
pgBar = ttk.Progressbar(window, orient = HORIZONTAL, length=300, mode = "determinate")
pgBar.place(x=45, y=130)
Run Code Online (Sandbox Code Playgroud)
我一直在做一些研究,并了解tkinter窗口在运行函数或类似的东西时冻结.有没有办法在主要内部调用的每个函数的末尾"解冻"窗口?
我想在Tkinter菜单命令上创建一个大文本,并通过进度条提供视觉支持.虽然进度条要在后续耗时循环之前启动,但只有在创建和显示大文本后才会显示进度条.
def menu_bar(self):
self.create_menu.add_command(label="Create large file",
command=self.create_large_file)
def create_large_file(self):
self.progressbar = ttk.Progressbar(self.master, mode='indeterminate')
self.progressbar.pack()
self.progressbar.start()
self.text.delete(1.0, 'end')
self.file_content = []
i = 0
while i < 2000000:
line = lfd.input_string
self.file_content.append(line + "\n")
i += 1
self.file_content = ''.join(self.file_content)
self.text.insert(1.0, self.file_content)
Run Code Online (Sandbox Code Playgroud) 我有一个简单的聊天客户端,我试图将其Tkinter作为界面使用.我的问题是,当为聊天输入/输出运行mainloopwith 时.after,窗口会冻结并阻塞,直到收到另一条消息.
class Client(Frame):
def __init__(self, **kwargs):
Frame.__init__(self, Tk())
self.pack()
self.lb = Listbox(self, width=100, height=30)
self.lb.pack()
self.show_data = self.lb.after(1000, self.chat_handle)
self.entry = Entry(self)
self.entry.bind('<Return>', self.input_handle)
self.entry.pack(side=BOTTOM, fill=X)
def input_handle(self, event):
msg = self.entry.get()
self.entry.delete(0, 'end')
new_msg = 'privmsg %s :' % self.channel + msg + '\r\n'
self.client.sendall(new_msg)
self.lb.insert(END, self.nick + ' | ' + msg)
def chat_handle(self):
try:
self.data = self.client.recvfrom(1024)
except socket.error:
self.lb.insert(END, "Bad Connection!")
return
if self.data and len(self.data[0]) > 0:
self.lb.insert(END, …Run Code Online (Sandbox Code Playgroud) 我似乎tkinter通过使用一些多线程来破坏linux。据我所知,我设法在不是主 GUI 线程的线程上触发垃圾回收。这导致__del__在一个tk.StringVar实例上运行,该实例试图tcl从错误的线程调用堆栈,从而导致 linux 上的混乱。
下面的代码是我能想出的最小例子。请注意,我没有用 做任何实际工作matplotlib,但否则我无法触发问题。在__del__对方法Widget验证的Widget情况下被从其他线程删除。典型的输出是:
Running off thread on 140653207140096
Being deleted... <__main__.Widget object .!widget2> 140653210118576
Thread is 140653207140096
... (omitted stack from from `matplotlib`
File "/nfs/see-fs-02_users/matmdpd/anaconda3/lib/python3.6/site-packages/matplotlib/text.py", line 218, in __init__
elif is_string_like(fontproperties):
File "/nfs/see-fs-02_users/matmdpd/anaconda3/lib/python3.6/site-packages/matplotlib/cbook.py", line 693, in is_string_like
obj + ''
File "tk_threading.py", line 27, in __del__
traceback.print_stack()
...
Exception ignored in: <bound method Variable.__del__ of <tkinter.StringVar object at 0x7fec60a02ac8>>
Traceback …Run Code Online (Sandbox Code Playgroud) 我有一个图像保存在一个文件中test.bmp,该文件每秒被覆盖 2 次
\n(我想每秒显示 2 个图像)。
这是我到目前为止所拥有的:
\n\nimport tkinter as tk\nfrom PIL import Image, ImageTk\n\nroot = tk.Tk()\nimg_path = 'test.bmp'\nimg = ImageTk.PhotoImage(Image.open(img_path), Image.ANTIALIAS))\n\ncanvas = tk.Canvas(root, height=400, width=400)\ncanvas.create_image(200, 200, image=img)\ncanvas.pack()\n\nroot.mainloop()\nRun Code Online (Sandbox Code Playgroud)\n\n但我不知道如何每隔 \xc2\xbd 秒刷新图像?
\n我正在使用 Python3 和 Tkinter。
from Tkinter import *
import tkFileDialog
import tkMessageBox
import os
import ttk
import serial
import timeit
import time
######################################################################################
class MyApp:
def __init__(self, parent):
########################################################
#Setup Frames
self.MiddleFrame = Frame(parent) #Middle Frame
self.MiddleFrame.pack()
#GLOBAL VARIABLES
self.chip_number = 0 #number of chip testing
###########################################
#Middle Frame setup
Label(self.MiddleFrame, text='Done').grid(row=8, column=1, sticky = E)
self.Done = Canvas(self.MiddleFrame, bg="yellow", width=10, height=10)
self.Done.grid(row=8, column=2)
Label(self.MiddleFrame, text='Chip Number:').grid(row=9, column=1, sticky = E)
#start button
self.button1 = Button(self.MiddleFrame,state=NORMAL, command= self.start_pre)
self.button1["text"]= "START"
self.button1.grid(row=1, column=2, sticky = …Run Code Online (Sandbox Code Playgroud) python ×7
tkinter ×6
python-3.x ×2
events ×1
exit ×1
image ×1
matplotlib ×1
progress-bar ×1
sockets ×1
ttk ×1