python写的程序如何将程序执行过程中所有的print()的输出显示到tkinter Text框内?

kent0122 2021-02-23 04:26:45
pyinstaller 打包后的程序执行时,所有的输出信息都是显示在黑色的CMD框内的,现在想把这些输出信息都显示在GUI 文本框里面,这样打包后就可以取消CMD黑色窗口了,所有进度以及报错信息都显示到GUI文本框内,求大神指点指点下。

比如说我点击第一步数据准备后,程序自动查询SQL,后台会显示查询到的数据信息,这个信息需要输出到这个GUI文本框内显示,其他的第二步,第三步等依此类推。因为程序中会有一些print()语句打印,也需要实时显示在文本框里。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""

"""
from __future__ import print_function
from tkinter import *
import threading
from func import wt_process as wp
from func import cx_process as cp
from func import prepare_date as pd
from func import creat_init as ci
from tkinter import messagebox
from tools import globVal
import tkinter as tk
import ctypes,sys
import logging
from logging import handlers

COMM_DICT, DB2_DICT, BK_DB2_DICT, DRTP_DICT, SPX_DICT = globVal.get_val()

def init_threading():
# 将函数打包到线程
if (v1.get() == -1):
messagebox.showinfo(title='未选择DB2', message='您还未选择主库还是备库,请先选择!!!')
else:
db2_info = ALL_DB2[v1.get()]
db2_ip = db2_info[2]
db2_port = db2_info[4]
gui_uid = e1.get()
gui_pass = e2.get()
t = threading.Thread(target=ci.creat_init,args=(gui_uid,gui_pass,db2_ip,db2_port))
t.setDaemon(True)
t.start()

def data_threading():
# 将函数打包到线程
if (v1.get() == -1):
messagebox.showinfo(title='未选择DB2', message='您还未选择主库还是备库,请先选择!!!')
else:
db2_info = ALL_DB2[v1.get()]
db2_ip = db2_info[2]
db2_port = db2_info[4]
gui_uid = e1.get()
gui_pass = e2.get()
t = threading.Thread(target=pd.prepare_data,args=(gui_uid,gui_pass,db2_ip,db2_port))
t.setDaemon(True)
t.start()

def wt_threading():
# 将函数打包到线程
if (v1.get() == -1):
messagebox.showinfo(title='未选择DB2', message='您还未选择主库还是备库,请先选择!!!')
else:
db2_info = ALL_DB2[v1.get()]
db2_ip = db2_info[2]
db2_port = db2_info[4]
comp_flag = v.get()
gui_uid = e1.get()
gui_pass = e2.get()

t = threading.Thread(target=wp.wt_process,args=(gui_uid,gui_pass,comp_flag,db2_ip,db2_port))
t.setDaemon(True)
t.start()

def cx_threading():
# 将函数打包到线程
if (v1.get() == -1):
messagebox.showinfo(title='未选择DB2', message='您还未选择主库还是备库,请先选择!!!')
else:
db2_info = ALL_DB2[v1.get()]
db2_ip = db2_info[2]
db2_port = db2_info[4]
gui_uid = e1.get()
gui_pass = e2.get()
t = threading.Thread(target=cp.cx_process,args=(gui_uid,gui_pass,db2_ip,db2_port))
t.setDaemon(True)
t.start()

def prit():
if v1.get() == 0 :
info = '主库'
elif v1.get() == 1 :
info = '备库'
messagebox.showinfo(title=info, message='此时选择的数据库是'+info+',请确认当前环境用的是主库还是备库')

def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False


if __name__=='__main__':

if is_admin():

global e1, e2, v, v1
root = Tk()
root.geometry('1024x768')
root.minsize(1024,768)
root.maxsize(1024,768)
root.iconbitmap(".\\logo.ico")
Text= tk.Text(root,width = 130,height = 35)
Text.place(x=80,y=280)

ALL_DB2 = {}
ALL_DB2.setdefault(0, []).append('主库DB2配置,')
ALL_DB2.setdefault(0, []).append('IP:')
ALL_DB2.setdefault(0, []).append(DB2_DICT['host'])
ALL_DB2.setdefault(0, []).append(',PORT:')
ALL_DB2.setdefault(0, []).append(DB2_DICT['port'])
if BK_DB2_DICT['host']:
ALL_DB2.setdefault(1, []).append('备库DB2配置,')
ALL_DB2.setdefault(1, []).append('IP:')
ALL_DB2.setdefault(1, []).append(BK_DB2_DICT['host'])
ALL_DB2.setdefault(1, []).append(',PORT:')
ALL_DB2.setdefault(1, []).append(BK_DB2_DICT['port'])
#print(ALL_DB2)

Label(root, text='1、显示文字1。', fg='red',
anchor='center').grid(row=1, sticky=W, columnspan=3)
Label(root, text='2、显示文字2。', fg='red', anchor='se').grid(row=2, sticky=W, columnspan=3)
Label(root, text='请选择对应的DB2环境', fg='black').grid(row=3, sticky=E, column=0)
v1 = IntVar()
v1.set(-1)
#v1.set(0)
if len(ALL_DB2) == 1:
v1.set(0)
row_id = 3
for key, value in ALL_DB2.items():
b = Radiobutton(root, text=value, variable=v1, value=key, command=prit).grid(row=row_id, column=1, sticky=W,
columnspan=2)
row_id += 1

Label(root, text='请输入DB2的用户名 :').grid(row=5, column=0, sticky=E)
Label(root, text='请输入DB2的密码 :').grid(row=6, column=0, sticky=E)

e1 = Entry(root)
e2 = Entry(root, show='*')
e1.grid(row=5, column=1, sticky=W, columnspan=2)
e2.grid(row=6, column=1, sticky=W, columnspan=2)
e1.delete(0, END)
e2.delete(0, END)
e1.insert(0, '*******')
e2.insert(0, '*******')


Button(root, text='第1步:数据准备', command=data_threading).grid(row=14, column=0)

v = IntVar()
Checkbutton(root, text='是否对比资金证券临时变动', variable=v).grid(row=14, column=1, sticky=W)

Button(root, text='第2步:发起委托', command=wt_threading).grid(row=15, column=0)

Button(root, text='第3步:发起查询', command=cx_threading).grid(row=16, column=0)

Button(root, text='第4步:生成数据', command=init_threading).grid(row=17, column=0)

Button(root, text='退出', command=root.quit).grid(row=15, column=2, sticky=W, rowspan=2)

root.mainloop()

else:
if sys.version_info[0] == 3:
ctypes.windll.shell32.ShellExecuteW(None, 'runas', sys.executable, __file__, None, 1)



...全文
2947 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
^小_波^ 2023-02-15
  • 打赏
  • 举报
回复

import sys
import tkinter as tk

class RedirectText:
def init(self, text_widget):
self.output = text_widget

def write(self, string):
    self.output.insert(tk.END, string)

创建 tkinter 窗口

root = tk.Tk()

创建 Text 组件

text_widget = tk.Text(root, wrap=tk.WORD)
text_widget.pack()

重定向标准输出

sys.stdout = RedirectText(text_widget)

执行你的 Python 程序,其中包含一些 print() 语句

print("Hello, world!")

运行 tkinter 窗口

root.mainloop()

在上面的代码中,我们首先定义了一个 RedirectText 类,用于重定向标准输出到指定的 Text 组件中。然后,我们创建了一个 tkinter 窗口和一个 Text 组件,并将标准输出重定向到这个 Text 组件中。最后,我们在 Python 程序中添加了一些 print() 语句,并在 tkinter 窗口中运行了这个程序。

运行这段代码后,你会发现程序执行过程中所有的 print() 输出都会显示在 Text 组件中。如果你的程序中包含大量的输出语句,那么这种方式可以方便地记录程序的执行过程和调试信息。

xiaohouzi112233 2023-02-15
  • 打赏
  • 举报
回复

请使用text,把所有的print语句转换为text.insert()....就等于把命令行输出的内容输出导文本上

中原第一高手 2023-01-21
  • 打赏
  • 举报
回复

同求解

zengjing0806 2022-05-24
  • 打赏
  • 举报
回复 1

请问解决了没?

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧