2016-04-07 158 views
0

PythonのTkinter .config()メソッドを使用してメッセージのテキストを更新しようとしています。私はそれを働かせることはできません。私は間違っているかもしれない(update_messageメソッドを参照してください):Python Tkinterの.config()メソッドを使用する

#!/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

を.SET?それを防ぐのは何ですか?エラーが発生していますか?何のエラー? –

+0

私はエラーを表示していません。テキストが表示されていない空白の画面です。 – interwebjill

答えて

0

私は文字列変数を使用します。最初に文字列変数を作成し、最初に表示したいオブジェクトを設定し、オブジェクト内のテキストを変更するときにスティン変数を置きます。文字列変数を変更します。

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 

オブジェクトを再作成せずにテキストを変更するには、編集 あなたが使用している文字列変数の名前を行うと、あなたはそれが仕事を得ることができない理由

self.messaget.set("hi") 
+0

しかし、tk.Messageを何度も繰り返し使用する場合は、毎回新しいウィジェットを作成しています。これが画面のちらつきを引き起こしています。毎回新しいウィジェットを作成しないように、.config()を使用したいと思います。 – interwebjill

+0

私の答えは明らかにはっきりしていませんでした。私は、テキストの代わりにtextvariableを置くことを示すメッセージを作っていました。値を変更すると、textvariableを変更している最後の行 – ryanmoir

関連する問題