使用Python Tkinter .config()方法

时间:2016-04-07 04:19:53

标签: python-2.7 tkinter

我正在尝试使用Python Tkinter .config()方法来更新一些消息文本。我无法让它发挥作用。我可能做错了什么(请参阅update_message方法):

#!/usr/bin/python

import alsaaudio as aa
import audioop
import Tkinter as tk
import tkFont
import threading
import Queue

# styles

BACKROUND_COLOR = '#000000'

TYPEFACE = 'Unit-Bold'
FONT_SIZE = 50
TEXT_COLOR = '#777777'

TEXTBOX_WIDTH = 400

# text

TITLE = 'listen closely'
SCORE_MESSAGE = 'your score:\n    '
END_MESSAGE = 'too loud!\ntry again'

# configuration

DEVICE = 'hw:1' # hardware sound card index
CHANNELS = 1
SAMPLE_RATE = 8000 # Hz // 44100
PERIOD = 256 # Frames // 256
FORMAT = aa.PCM_FORMAT_S8 # Sound format

NOISE_THRESHOLD = 3

class Display(object):

    def __init__(self, parent, queue):
        self.parent = parent
        self.queue = queue

        self._geom = '200x200+0+0'
        parent.geometry("{0}x{1}+0+0".format(
            parent.winfo_screenwidth(), parent.winfo_screenheight()))
        parent.overrideredirect(1)

        parent.title(TITLE)
        parent.configure(background=BACKROUND_COLOR)
        parent.displayFont = tkFont.Font(family=TYPEFACE, size=FONT_SIZE)
        self.process_queue()

    def process_queue(self):
        try:
            score = self.queue.get(0)
            self.print_message(score)
        except Queue.Empty:
            pass

        self.parent.after(100, self.update_queue)

    def update_queue(self):
        try:
            score = self.queue.get(0)
            self.update_message(score)
        except Queue.Empty:
            pass

        self.parent.after(100, self.update_queue)

    def print_message(self, messageString):
        print 'message', messageString
        displayString = SCORE_MESSAGE + str(messageString)
        self.message = tk.Message(
            self.parent, text=displayString, bg=BACKROUND_COLOR,
            font=self.parent.displayFont, fg=TEXT_COLOR, width=TEXTBOX_WIDTH, justify="c")
        self.message.place(relx=.5, rely=.5, anchor="c")

    def update_message(self, messageString):
        print 'message', messageString
        displayString = SCORE_MESSAGE + str(messageString)
        self.message.config(text=displayString)


def setup_audio(queue, stop_event):
    data_in = aa.PCM(aa.PCM_CAPTURE, aa.PCM_NONBLOCK, 'hw:1')
    data_in.setchannels(2)
    data_in.setrate(44100)
    data_in.setformat(aa.PCM_FORMAT_S16_LE)

    data_in.setperiodsize(256)

    while not stop_event.is_set():
        # Read data from device
        l, data = data_in.read()
        if l:
            # catch frame error
            try:
                max_vol = audioop.rms(data, 2)
                scaled_vol = max_vol // 4680
                print scaled_vol

                if scaled_vol <= 3:
                    # Too quiet, ignore
                    continue

                queue.put(scaled_vol)

            except audioop.error, e:
                if e.message != "not a whole number of frames":
                    raise e


def main():
    root = tk.Tk()
    queue = Queue.Queue()
    window = Display(root, queue)

    stop_event = threading.Event()
    audio_thread = threading.Thread(target=setup_audio,
                                    args=[queue, stop_event])
    audio_thread.start()
    try:
        root.mainloop()
    finally:
        stop_event.set()
        audio_thread.join()
        pass

if __name__ == '__main__':
    main()

每次更新时,我都不想放下新消息。如果.config()不起作用,是否有另一种方法来更新消息的文本配置?

1 个答案:

答案 0 :(得分:0)

我会使用字符串变量,首先创建你的字符串变量,然后将它设置为希望你在开始时显示你的对象和文本中放置sting变量然后当你想要更改对象中的文本时字符串变量。

self.messaget = StringVar()
self.messaget.set("")
self.message = tk.Message(
            self.parent, textvariable=self.messaget, bg=BACKROUND_COLOR,
            font=self.parent.displayFont, fg=TEXT_COLOR, 
            width=TEXTBOX_WIDTH, justify="c").grid()
#note renember to palce the object after you have created it either using 
#.grid(row = , column =) or .pack()
#note that it is textvariable instead of text if you put text instead it will run but
#but will show PY_Var instead of the value of the variable

编辑 要在不重新创建对象的情况下更改文本,请使用您使用的字符串变量的名称和.set

self.messaget.set("hi")