TKINTER创建了一个程序实现办公需要,根据要办理的业务选择菜单上的功能!点击菜单栏上数据库下面的标签会弹出一个QDIALOG做出的窗口,但是不能同时打开2个窗口,也不能打开一个窗口后进行其他的简单的程序操作,比如也不可以点击标签打开我想要的文件地址,只有关闭窗口后才可以进行其他的操作,所以我考虑用进程
但是用了后不起作用,可能是我水平问题,错误代码如下
Fatal Python error: PyEval_RestoreThread: NULL tstate
Current thread 0x0000420c (most recent call first):
File "c:\Users\Administrator\Desktop\u65b0\u7a0b\u529e\u516c\u8f6f\u4ef6\u5347\u7ea7\u5feb\u901f\u7248\items_edit.py", line 316 in main
我的程序代码如下:
from tkinter import *
import tkinter as tk
import multiprocessing
import pr,sys,datetime,os
from importlib import reload
from tkinter import scrolledtext
from datetime import date
class Project:
def __init__(self):
reload(pr)
self.d=datetime.date.today()
def multi_it(self, x):
print(x)
t = multiprocessing.Process(target=self.menu(x))
t.start()
def create_button(self):
menubar=Menu(self.top)
fmenu2=Menu(self.top)
fmenu2.add_command(label='产品数据库增删改查',command=lambda x=12:self.multi_it(x))
fmenu2.add_command(label='客户数据库增删改查',command=lambda x=13:self.multi_it(x))
fmenu2.add_command(label='包装数据库增删改查',command=lambda x=14:self.multi_it(x))
fmenu2.add_command(label='供应商数据库增删改查',command=lambda x=18:self.multi_it(x))
fmenu3=Menu(self.top)
fmenu3.add_command(label='游乐场',command=lambda x=1: self.dingwei(x))
fmenu3.add_command(label='客户分区报价中心',command=lambda x=2: self.dingwei(x))
fmenu3.add_command(label='编织绳',command=lambda x=3: self.dingwei(x))
self.top['menu']=menubar
def dingwei(self,x):
choice=x
if choice == 1:
path_doc= r'E:\2 体育 健身 娱乐\0 游乐场'
if choice == 2:
path_doc=r'E:\2 体育 健身 娱乐\0 游乐场\05 客户开发\00 客户分区报价中心'
if choice == 3:
path_doc=r'E:\5 Plastic rope\01 编织绳'
os.startfile(path_doc)
def menu(self,x):
self.mchoice=x
if self.mchoice == 12:
from items_edit import window
window.main(self)
elif self.mchoice == 13:
from customer_info_edit import window
window.main(self)
elif self.mchoice == 14:
from pkg_info_edit import window
window.main(self)
elif self.mchoice == 18:
from supplier_info_edit import window
window.main(self)
def main(self):
class StdoutRedirector(object):
def __init__(self, text_widget):
self.text_space = text_widget
self.stdoutbak = sys.stdout
self.stderrbak = sys.stderr
def write(self, str):
self.text_space.insert(END, "\n"+str)
self.text_space.see(END)
self.text_space.update()
def restoreStd(self):
sys.stdout = self.stdoutbak
sys.stderr = self.stderrbak
def flush(self):
pass
self.top=Tk()
self.top.iconbitmap('logo01.ico')
self.top.wm_title("新程业务助手T.22.0")
self.top.config(bg='white')
self.top.geometry("950x500+300+100")
self.create_button()
global t,a,b
t = scrolledtext.ScrolledText(self.top,relief="solid", width=260, height=450) # 创建多行文本控件
t.pack() # 布局在窗体上
t.configure(font=("Courier", 12, "italic"))
a=tk.END
t.tag_add('tag',a) #申明一个tag,在a位置使用
t.tag_config('tag',foreground='red') #设置tag即插入文字的大小,颜色等
b=tk.END
t.tag_add('tag1',b) #申明一个tag,在a位置使用
t.tag_config('tag1',foreground='blue') #设置tag即插入文字的大小,颜色等
output = sys.stdout # 二级备份
sys.stdout = StdoutRedirector(t)
self.top.mainloop()
if __name__ == '__main__':
project1 = Project()
project1.main()
我想怎么样用进程实现同时可以打开两个QDIALOG窗口,注意我不是一定要打开两个窗口,是根据办公需要,有时候不需要打开,如果不用进程也没什么别的好的办法了吧!
虽然我不知道你为神马要tk调用qt的东西
但是我写了下下面这个代码 你参考下
import tkinter as tk
import subprocess
window = tk.Tk()
window.title("Window Title")
window.geometry('200x100')
lbl = tk.Label(window, text="Hello World")
lbl.pack()
def clicked(): #function before bind
process = subprocess.Popen("python3 test_test.py", shell=True)
process.wait()
# window.destroy()
btn = tk.Button(window, text="Click Me", command=clicked)
btn.pack()
window.mainloop()
test_test.py
from PyQt6.QtWidgets import (QWidget, QPushButton, QLineEdit,
QInputDialog, QApplication)
import sys
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.btn = QPushButton('Dialog', self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
self.le = QLineEdit(self)
self.le.move(130, 22)
self.setGeometry(300, 300, 450, 350)
self.setWindowTitle('Input dialog')
self.show()
def showDialog(self):
text, ok = QInputDialog.getText(self, 'Input Dialog',
'Enter your name:')
if ok:
self.le.setText(str(text))
def pyqtwindow():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
pyqtwindow()
从错误信息来看,PyEval_RestoreThread: NULL tstate 的错误是在 line 316 的 main 函数中发生的。这个错误是由于在 Python 脚本中使用了多线程或多进程,而 Tkinter 在 GUI 中是不支持多线程或多进程的。
解决这个问题可以使用 Tkinter 的 after() 方法,来实现延迟执行,而不是使用 multiprocessing 模块。也可以使用 threading模块 + queue模块来解决问题。
仅供参考。
建议根据需要设置相应的弹窗即可,有相应的选择打开文件弹窗tkinter.filedialog.askopenfile,常用的弹窗类型如下:
1、对话框
tkinter.messagebox.askokcancel('提示', '要执行此操作吗')#确定/取消,返回值true/false
tkinter.messagebox.askquestion('提示', '要执行此操作吗')#是/否,返回值yes/no
tkinter.messagebox.askyesno('提示', '要执行此操作吗')#是/否,返回值true/false
tkinter.messagebox.askretrycancel('提示', '要执行此操作吗')#重试/取消,返回值true/false
2、文件对话框
import tkinter.filedialog
a=tkinter.filedialog.asksaveasfilename()#返回文件名
print(a)
a =tkinter.filedialog.asksaveasfile()#会创建文件
print(a)
a =tkinter.filedialog.askopenfilename()#返回文件名
print(a)
a =tkinter.filedialog.askopenfile()#返回文件流对象
print(a)
a =tkinter.filedialog.askdirectory()#返回目录名
print(a)
a =tkinter.filedialog.askopenfilenames()#可以返回多个文件名
print(a)
a =tkinter.filedialog.askopenfiles()#多个文件流对象
print(a)
楼主您好,
从Fatal Python error: PyEval_RestoreThread: NULL tstate 这个错误消息表明在脚本运行过程中发生了一个严重的错误。这个错误通常是由于在脚本中调用了一个无效的 Python 线程(或线程状态)导致的。
在你的代码中,你使用了 multiprocessing 模块来创建多个进程来运行程序中的不同部分。然而,在调用进程时,你没有使用 join() 方法来等待进程结束,因此可能会导致多个进程并发运行。这会使得程序状态变得混乱,导致错误发生。
为了解决这个问题,你需要在启动进程后调用它的 join() 方法来等待进程结束。例如,可以将 t.start() 替换为 t.start(); t.join()。 这样可以保证各个窗口的调用顺序,同时也能让用户进行其他操作。
如果还有其他问题,请告诉我,我会尽力帮助你解决。有用请您及时采纳。