TKINTER根据标签创建进程怎么弄?

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()


img


关闭Dialog窗口后

img

从错误信息来看,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()。 这样可以保证各个窗口的调用顺序,同时也能让用户进行其他操作。

如果还有其他问题,请告诉我,我会尽力帮助你解决。有用请您及时采纳。