回答編集履歴

1 表現変更

y.nakamura

y.nakamura score 186

2019/04/23 10:02  投稿

2. ラベルの文字を変更する方法は、`app.lb["text"] = "文字列"`です。
まずthread1でappを参照するために、`app`をグローバル変数にしましょう。
thread1とthread2の中で`global app`と宣言すると、グローバル変数になります。
まず`onMouseMove`で`app`を参照するために、`app`をグローバル変数にしましょう。
`thread1`と`thread2`の中で`global app`と宣言すると、グローバル変数になります。
まとめると以下のようになります。(クリックした座標をラベルに表示します)
```
import cv2
import numpy as np
import copy
import tkinter as tk
import threading
def thread1():
   global app
   class Camera():
       def __init__(self):
           cv2.namedWindow("img",cv2.WINDOW_NORMAL)
           cv2.setMouseCallback("img",self.onMouseMove)
           self.img = cv2.imread("src/Lena.jpg")
           self.img_copy = self.img
           self.x_pos = None
           self.y_pos = None
           self.font = cv2.FONT_HERSHEY_SIMPLEX
       def run(self):
           while(True):
               cv2.imshow("img",self.img)
               #if self.x_pos is not None:
                  #cv2.putText(self.img,str(self.img[self.y_pos][self.x_pos]),(300,300),self.font,
                               #0.4,(0,0,0),1)
               if cv2.waitKey(1) & 0xFF == ord('q'):
                   break
           cv2.destroyAllWindows()
       def onMouseMove(self,event,x,y,flags,parm):
           if event == cv2.EVENT_LBUTTONDOWN:
               self.img = copy.deepcopy(self.img_copy)
               self.x_pos = x
               self.y_pos = y
               #app.lb["text"] = "押されたよー"
               print("画面押した")
               #print(app.bt["text"],"押してる")
               # print(app.bt["text"],"押してる")
               app.lb["text"] = "x={},y={}".format(x, y)
   obj = Camera()
   obj.run()
def thread2():
   global app
   class Application(tk.Frame):
       def __init__(self,master =None):
           super().__init__(master)
           master.title("タイトル")
           master.geometry("350x150")
           self.pack()
           self.create_widgets()
       def create_widgets(self):
           self.lb = tk.Label()
           self.lb["text"] = "ラベラー"
           self.lb.pack(side="top")
           self.bt = tk.Button()
           self.bt["text"] = "ボタン"
           self.bt["command"] = self.print_txtval
           self.bt.pack(side="bottom")
       def print_txtval(self):
           print("ボタンが押された")
           print(self.bt["text"])
   root = tk.Tk()
   app = Application(master = root)
   app.mainloop()
th1 = threading.Thread(target = thread1)
th2 = threading.Thread(target = thread2)
th1.start()
th2.start()
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る