绳绳不息David 2023-01-10 14:50 采纳率: 33.3%
浏览 110
已结题

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窗口,注意我不是一定要打开两个窗口,是根据办公需要,有时候不需要打开,如果不用进程也没什么别的好的办法了吧!

  • 写回答

5条回答 默认 最新

  • Ko-walski 2023-01-10 21:27
    关注

    虽然我不知道你为神马要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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月19日
  • 已采纳回答 1月11日
  • 修改了问题 1月10日
  • 修改了问题 1月10日
  • 展开全部

悬赏问题

  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?