在tkinter实验室显示实时控制台输出

2024-10-03 19:26:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想弄明白怎么做几天都没成功。 正如标题中提到的,有没有任何方法可以使用tkinter在某种文本框或标签中显示控制台输出(特别是下面代码中的打印输出)?在

我有一个程序,可以读取一个.txt文件,并使用他的数据将一些坐标传递给一个正在我公司运行车队管理平台的云。在

感谢任何帮助!在

import json
import csv
import math
from math import sin, cos, sqrt, atan2, radians
import requests
from requests.auth import HTTPBasicAuth
import time
from tkinter import Tk, Label, Button, OptionMenu, Text, PhotoImage, StringVar
from functools import partial

begin = False
start = False
running = False
endTrip = False
running_counter = 0
payload_count = 0
num_lines = 0

headers = {
    'Content-Type': 'application/json',
    'Accept': 'text/plain',
}
payload_model = open('payload.json')
payload_file = json.load(payload_model)
file_name = ''
payload_model.close()

def btnStart_func(botao):
    global start
    start = not start
    lbl1['text'] = str(start)

def btnRunn_func(botao):
    global running
    running = not running
    lbl2['text'] = str(running)

def btnEnd_func(botao):
    global endTrip
    endTrip = not endTrip
    lbl3['text'] = str(endTrip)

def changeRoute():
    global file_name
    global num_lines
    file_name = var.get()
    print(file_name)
    try:
        with open(file_name) as fn:
            for line in fn:
                num_lines = num_lines+1
            fn.close()
            print(num_lines)
            num_lines = 0
    except IOError:
        print("file not found")


def beginSend():
    try:
        #'Global' to access the variables outside the function
        global file_name
        global payload_count
        global start
        global running
        global endTrip
        global running_counter
        with open(file_name) as csvfile:
            readCSV = csv.reader(csvfile, delimiter=',')
            for row in readCSV:
                payload_count = payload_count + 1
                if start == False:
                    print("Starting")
                    response = requests.post('SORRY, OMITED ',
                                             json=payload_file, headers=headers, auth=('user', 'password'))
                    print(str(response.status_code))
                    start = True
                elif running == False:
                    lat = row[2]
                    orient = row[3]
                    lon = row[4]
                    direction = row[5]
                    altitude = round(float(row[8]))
                    latdec = round(math.floor(float(lat) / 100) + (float(lat) % 100) / 60, 6)
                    if orient == 'S':
                        lat_decimal = latdec * -1
                    londec = round(math.floor(float(lon) / 100) + (float(lon) % 100) / 60, 6)
                    if direction == 'W':
                        lon_decimal = londec * -1
                    print(lat_decimal)
                    print(lon_decimal)

                    # Passing the coordinates to Json
                    payload_file['d']['message']['latitude'] = lat_decimal
                    payload_file['d']['message']['longitude'] = lon_decimal
                    payload_file['d']['message']['altitude'] = altitude

                    # Saving log files
                    payload_out_name = str(payload_count) + ' - payload_out.json'
                    payload_out = open(payload_out_name, 'w')
                    json.dump(payload_file, payload_out)
                    payload_out.close()
                    print("Running payload " + str(running_counter))
                    response = requests.post('SORRY, OMITED',
                                             json=payload_file, headers=headers, auth=('user', 'password'))
                    print(str(respose.status_code))
                    running_counter = running_counter + 1
                    if running_counter >= num_lines - 2:
                        running = True
                else:
                    if endTrip == False:
                        print("Entering END")
                        response = requests.post('SORRY, OMITED',
                                                 json=payload_file, headers=headers, auth=('user', 'password'))
                        print(str(response.headers))
                        print("END HEADER")
                        endTrip = True


    except IOError as e:
        print(e)


window = Tk()
text = Text(window)
text.tag_configure("BOLD")
window['bg']= 'gray'
bg_image_name = PhotoImage(file = 'SORRY, OMITED')
bg_label = Label(window, image=bg_image_name)
bg_label.place(x=0,y=0)


btn1 = Button(window, text='START', width= '20',font='Helvetica', fg='Blue')
btn1['command'] = partial(btnStart_func,btn1)
btn1.place(x=20,y=70)
btn2 = Button(window, text='RUNNING',width='20',font='Helvetica', fg='Blue')
btn2['command']= partial(btnRunn_func, btn2)
btn2.place(x=20,y=110)
btn3 = Button(window, text='END',width='20',font='Helvetica', fg='Blue')
btn3['command']= partial(btnEnd_func, btn3)
btn3.place(x=20,y=150)
btn5 = Button(window, text='CHANGE ROUTE',width='20',font='Helvetica', fg='Blue', command=changeRoute)
btn5.place(x=20,y=190)
btn4 = Button(window, text='BEGIN',width='20',font='Helvetica', fg='Blue', command=beginSend)
btn4.place(x=100,y=240)


OPTIONS = [
    'hopihari-guaruja.txt',
    'zooGuar-zooSP.txt',
    'picoJaragua-Interlagos.txt',
    'pqIbi-shopTatu.txt'
]

var = StringVar(window)
var.set(OPTIONS[0])

dropMenu = OptionMenu(window, var, *OPTIONS)
dropMenu.place(x=250, y=190)

menu = dropMenu.nametowidget(dropMenu.menuname)
menu.configure(font=('Impact', 20))

lbl1 = Label(window, text=str(start), font='Helvetica', fg='Blue')
lbl1.place(x=290,y=70)
lbl2 = Label(window, text=str(running), font='Helvetica', fg='Blue')
lbl2.place(x=290,y=110)
lbl3 = Label(window, text=str(endTrip), font='Helvetica', fg='Blue')
lbl3.place(x=290,y=150)
lbl4 = Label(window, text='HARDWARE SIMULATOR', font='Helvetica', fg='Black')
lbl4.place(x=70, y=25)



janela.geometry('400x400')
janela.title('HARDWARE SIMULATOR 1.0')
janela.mainloop()

@edit:问题解决了 好吧,经过两天的努力,我终于找到了办法。首先,我把我的代码裁剪成函数,正如你在上面的代码中看到的,我只在一个函数中运行我的主逻辑,我把这个函数分成了更小的函数,如下所示。 为了显示使用标签的结果,我创建了一个函数,每次需要更新标签时都会调用该函数(def attLabel()) 如果你试着运行上面的代码,你会发现当循环发生时GUI会冻结,为了解决这个问题,我使用线程库,在一个线程中运行我的逻辑,在另一个线程中运行GUI,这样我就可以在标签中显示活值了。 我知道我的代码不干净也不漂亮,但它做了他应该做的,所以。。。在

^{pr2}$

谢谢大家的帮助!在


Tags: textnameimportjsonplacewindowglobalstart
1条回答
网友
1楼 · 发布于 2024-10-03 19:26:18

我找到的解决方案是: 创建线程以在mainloop()之外运行函数 当我们在de mainloop()线程中有任何类型的循环时,就会出现问题。 我用那个函数来解决我的问题

定义你自己的名字,我的名字是endTrue

def endTrue():
    global flag
    send_process = Thread(target=begin)
    send_process.start()
    flag = False

变量来控制新线程内的循环

^{pr2}$

target=要在侧线程中执行的函数

send_process = Thread(target=begin)

启动新线程

 send_process.start()

用于控制循环的变量

flag = False

希望这对将来的人有帮助,gl和hf!在

相关问题 更多 >