tkinter root.mainloop与While True循环

我正在使用tkinter来显示一些基于所读取电压的标签。但是,它在读取一次后停止执行。我发现这是由于root.mainloop()引起的。但是我无法修复它。我已经包含了我的代码。root.mainloop()位于while

True末尾。

from Tkinter import *

import spidev

import time

import os

import RPi.GPIO as GPIO

import numpy

GPIO.cleanup()

GPIO.setmode(GPIO.BOARD)

GPIO.setup(7, GPIO.OUT)

GPIO.setup(11, GPIO.OUT)

GPIO.setup(13, GPIO.OUT)

GPIO.setup(15, GPIO.OUT)

GPIO.setup(12, GPIO.OUT)

adcvolt = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

batvolt = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

root = Tk() #Makes the window

w,h = root.winfo_screenwidth(), root.winfo_screenheight()

root.overrideredirect(1)

root.geometry("%dx%d+0+0"%(w,h))

labelFont = ("times",15 ,"bold", "italic")

labelText1 = StringVar()

labelText2 = StringVar()

labelText3 = StringVar()

labelText4 = StringVar()

labelText5 = StringVar()

labelText6 = StringVar()

labelText1.set("Battery Management System")

label1 = Label(root, textvariable=labelText1, height=3, anchor="center")

label1.config(font=labelFont)

label1.pack()

labelText2.set("Wait")

label2 = Label(root, textvariable=labelText2, height=3, anchor="center")

label2.config(font=labelFont)

label2.pack()

labelText3.set("Wait")

label3 = Label(root, textvariable=labelText3, height=3, anchor="center")

label3.config(font=labelFont)

label3.pack()

labelText4.set("Wait")

label4 = Label(root, textvariable=labelText4, height=3, anchor="center")

label4.config(font=labelFont)

label4.pack()

labelText5.set("Wait")

label5 = Label(root, textvariable=labelText5, height=3, anchor="center")

label5.config(font=labelFont)

label5.pack()

labelText6.set("Wait")

label6 = Label(root, textvariable=labelText6, height=3, anchor="center")

label6.config(font=labelFont)

label6.pack()

#root.wm_title("Window Title") #Makes the title that will appear in the top left

#root.config(background = "#FFFFFF") #sets background color to white

# Open SPI bus

spi = spidev.SpiDev()

spi.open(0,0)

# Function to read SPI data from MCP3008 chip

# Channel must be an integer 0-7

def ReadChannel(channel):

adc = spi.xfer2([1,(8+channel)<<4,0])

data = ((adc[1]&3) << 8) + adc[2]

return data

#Function to select multiplexer channel on 74HCT4067 chip

#Channel must be an integer 0-15

def MuxSelect(muxchannel):

if muxchannel == 0:

GPIO.output(7,0)

GPIO.output(11,0)

GPIO.output(13,0)

GPIO.output(15,0)

elif muxchannel == 1:

GPIO.output(7,0)

GPIO.output(11,0)

GPIO.output(13,0)

GPIO.output(15,1)

elif muxchannel == 2:

GPIO.output(7,0)

GPIO.output(11,0)

GPIO.output(13,1)

GPIO.output(15,0)

elif muxchannel == 3:

GPIO.output(7,0)

GPIO.output(11,0)

GPIO.output(13,1)

GPIO.output(15,1)

elif muxchannel == 4:

GPIO.output(7,0)

GPIO.output(11,1)

GPIO.output(13,0)

GPIO.output(15,0)

elif muxchannel == 5:

GPIO.output(7,0)

GPIO.output(11,1)

GPIO.output(13,0)

GPIO.output(15,1)

elif muxchannel == 6:

GPIO.output(7,0)

GPIO.output(11,1)

GPIO.output(13,1)

GPIO.output(15,0)

elif muxchannel == 7:

GPIO.output(7,0)

GPIO.output(11,1)

GPIO.output(13,1)

GPIO.output(15,1)

elif muxchannel == 8:

GPIO.output(7,1)

GPIO.output(11,0)

GPIO.output(13,0)

GPIO.output(15,0)

elif muxchannel == 9:

GPIO.output(7,1)

GPIO.output(11,0)

GPIO.output(13,0)

GPIO.output(15,1)

elif muxchannel == 10:

GPIO.output(7,1)

GPIO.output(11,0)

GPIO.output(13,1)

GPIO.output(15,0)

elif muxchannel == 11:

GPIO.output(7,1)

GPIO.output(11,0)

GPIO.output(13,1)

GPIO.output(15,1)

elif muxchannel == 12:

GPIO.output(7,1)

GPIO.output(11,1)

GPIO.output(13,0)

GPIO.output(15,0)

elif muxchannel == 13:

GPIO.output(7,1)

GPIO.output(11,1)

GPIO.output(13,0)

GPIO.output(15,1)

elif muxchannel == 14:

GPIO.output(7,1)

GPIO.output(11,1)

GPIO.output(13,1)

GPIO.output(15,0)

elif muxchannel == 15:

GPIO.output(7,1)

GPIO.output(11,1)

GPIO.output(13,1)

GPIO.output(15,1)

# Function to convert data to voltage level,

# rounded to specified number of decimal places.

def ConvertVolts(data,places):

volts = (data * 3.3) / 1023

volts = round(volts,places)

return volts

# Define sensor channels

voltage_channel = 0

# Define delay between readings

delay = 2

while True:

count = 0

while count<15:

MuxSelect(count)

# Read the voltage sensor data

voltage_level = ReadChannel(voltage_channel)

voltage_volts = ConvertVolts(voltage_level,2)

adcvolt[count] = voltage_volts

batvolt[count] = adcvolt[count] * 2.842

#print adcvolt[count]

#print batvolt[count]

#print count

count = count + 1

#time.sleep(delay)

labelText2.set('Cell1= '+str(batvolt[0])+'V Cell2= ' +str(batvolt[1])+'V Cell3= '+str(batvolt[2]))

#root.update()

labelText3.set('Cell4= '+str(batvolt[3])+'V Cell5= ' +str(batvolt[4])+'V Cell6= '+str(batvolt[5]))

# root.update()

labelText4.set('Cell7= '+str(batvolt[6])+'V Cell8= ' +str(batvolt[7])+'V Cell9= '+str(batvolt[8]))

# root.update()

labelText5.set('Cell10= '+str(batvolt[9])+'V Cell11= ' +str(batvolt[10])+'V Cell12= '+str(batvolt[11]))

# root.update()

labelText6.set('Cell13= '+str(batvolt[12])+'V Cell14= ' +str(batvolt[13])+'V Cell15= '+str(batvolt[14]))

root.update()

print "shit"

medianvolt = numpy.median(batvolt)

maxvolt = max(batvolt)

minvolt = min(batvolt)

diff1 = maxvolt-medianvolt

diff2 = medianvolt-minvolt

if diff1>0.02 or diff2>0.02:

GPIO.output (12,1)

time.sleep(120)

GPIO.output (12,0)

# Wait before repeating loop

time.sleep(delay)

root.update()

root.mainloop() #start monitoring and updating the GUI. Nothing below here runs.

回答:

Tkinter需要mainloop工作(以调用所有功能)。

使用root.after(time_ms, function_name_without_() )(之前mainloop

运行某些功能-该功能必须运行相同的功能才能after(...)循环工作。

在Tkinter中,您不使用,while True因为while True是使(main)循环,

但Tkinter具有自己的mainloop

而且不要使用sleep()-使用after()

while True(除外mainloop)中的所有代码放入某个函数中,然后使用进行调用after()

用秒after()代替sleep()

import Tkinter as tk

master = tk.Tk()

def my_mainloop():

print "Hello World!"

master.after(1000, my_mainloop)

master.after(1000, my_mainloop)

master.mainloop()

以上是 tkinter root.mainloop与While True循环 的全部内容, 来源链接: utcz.com/qa/401633.html

回到顶部