如何在程序的文本窗口中实时更改外部接收的数据输出?

时间:2018-01-16 01:07:36

标签: python tkinter

我一直不愿意提出这个问题 - 我一直在努力解决这个问题并且到处寻找!

所以,我经营一家公司,我们有几个第三方通过电子邮件向我们发送销售通知 - 所有这些都发送到不同的地址。每封给我们的电子邮件都是一次销售。问题在于办公室中没有任何地方可以看到当前的销售(提交)总数。我从小就一直渴望学习Python所以我想我会找到一种很酷的方式来图形显示一种在屏幕上有大量数字的自动收报机,我们可以挂在办公室的墙上让所有人都能看到,通过Raspberry Pi和LCD。但我的傻瓜很难做到。

在Python之外,一切都很好,我已经找到了发送到一个收件箱的电子邮件,我已设法在我们的Gmail上设置一个计时器,以便在24小时后标记读取。我遇到的问题是我真的希望程序能够自动实时更新未读数的计数,而不会在屏幕上永久滚动。

我到处寻找,循环似乎没有刷新窗口上的数字,除了重新启动程序之外什么都没有用,这不是自动化的,需要我自己再次启动程序。所以,,对此的任何帮助都会很棒。我打算稍后添加图片,也许会有一些声音在销售时出现ping或CHaaaChing,但我认为我先把这些困难的东西拿走了。

这是我的代码:

#! /usr/bin/env python3.4
import imaplib
import email

from tkinter import *
root = Tk()


def window(main):
    main.title('submissions counter')
    width = 500
    height = 500
    x = (main.winfo_screenwidth() //2 ) - (width // 2)
    y = (main.winfo_screenheight() //2 ) - (height // 2)
    main.geometry('{}x{}+{}+{}'.format(width, height, x, y))

mail=imaplib.IMAP4_SSL('imap.gmail.com',993)
mail.login('email@gmail.com','Password')
mail.select("Submissions")
typ, messageIDs = mail.search(None, "UNSEEN")
messageIDsString = str( messageIDs[0], encoding='utf8' )
listOfSplitStrings = messageIDsString.split(" ")

if len(listOfSplitStrings) == 0:
    print('no submissions')
elif len(listOfSplitStrings) == 1:
    print(len(listOfSplitStrings),'submission[s]')
else:
    print(len(listOfSplitStrings),'submission[s]')

def main_content():
    hello = Label(root, text=(len(listOfSplitStrings),'submission[s]'))
    hello.pack()

window(root)
main_content()
root.mainloop()

现在我正在尝试使用此代码并且根本不会从中获取任何内容,没有错误消息,文本框或命令行上没有结果......

#! /usr/bin/env python3.4
import imaplib
import email
import tkinter as tk

WIDTH = 500
HEIGHT = 500


def update():
    mail=imaplib.IMAP4_SSL('imap.gmail.com',993)
    mail.login('email"gmail.com','password')
    mail.select("Submissions")
    typ, messageIDs = mail.search(None, "UNSEEN")
    messageIDsString = str( messageIDs[0], encoding='utf8' )
    listOfSplitStrings = messageIDsString.split(" ")

    number = len(listOfSplitStrings)

    if number == 0:
        info['text'] = 'no submissions'
    else:
        info['text'] = '{} submissions[s]'.format(number)

    root.after(5000, update)

root = tk.Tk()

root.title('submissions counter')

x = (root.winfo_screenwidth()//2) - (WIDTH//2)
y = (root.winfo_screenheight()//2) - (HEIGHT//2)
root.geometry('{}x{}+{}+{}'.format(WIDTH, HEIGHT, x, y))

info = tk.Label(root, text='no submissions')
info.pack

update()
root.mainloop()

1 个答案:

答案 0 :(得分:0)

您似乎需要root.after(milliseconds, function_name)定期执行函数,而不是阻止在窗口中重绘小部件的mainloop()

我看起来像这样

#! /usr/bin/env python3.4
import imaplib
import email
import tkinter as tk
#import random # for test without using mail

# --- constants --- (UPPER_CASE_NAMES)

WIDTH = 500
HEIGHT = 500

# --- functions --- (lower_case_names)

def update():

    mail = imaplib.IMAP4_SSL('imap.gmail.com', 993)
    mail.login('email@gmail.com', 'Password')
    mail.select("Submissions")
    typ, messageIDs = mail.search(None, "UNSEEN")
    messageIDsString = str(messageIDs[0], encoding='utf8')
    listOfSplitStrings = messageIDsString.split(" ")

    number = len(listOfSplitStrings)    
    #number = random.randint(0, 5) # for test without using mail

    if number == 0:
        #print('no submissions')
        info['text'] = 'no submissions'
    else:
        #print(number, 'submission[s]')
        info['text'] = '{} submission[s]'.format(number)

    # update again after 5000ms (5seconds)
    root.after(5000, update)

# --- main --- (lower_case_names)

root = tk.Tk()

root.title('submissions counter')

x = (root.winfo_screenwidth()//2) - (WIDTH//2)
y = (root.winfo_screenheight()//2) - (HEIGHT//2)
root.geometry('{}x{}+{}+{}'.format(WIDTH, HEIGHT, x, y))

# create label for information
info = tk.Label(root, text='no submissions')
info.pack()

# update label first time
update()

root.mainloop()