質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

918閲覧

lid=1をdevicesのコンボボックスに変更して中身を切り替えて表示させたい

hinata_0123

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/29 11:21

編集2021/10/29 11:43

python

1コード 2 3import tkinter as tk 4# tkinterモジュールをtkとしてインポート 5import tkinter.ttk as ttk 6# tkinterのttkをttkとしてインポート 7import matplotlib.pyplot as plt 8# matplotlibモジュールのpyplotをpltとしてインポート 9from matplotlib.backends.backend_tkagg import ( 10 FigureCanvasTkAgg, NavigationToolbar2Tk) 11# FigureCanvasTkAggとNavigationToolbar2Tkのインポート 12from random import random 13# randomモジュールからrandom関数をインポート 14from datetime import datetime 15 # datetimeモジュールからdatetime関数のインポート 16from functools import partial 17# functoolsモジュールからpartialのインポート 18import pymysql.cursors 19# pymysqlモジュールのcursorsをインポート 20#-------------------------------------------------------------------- 21def select(yyyy,MM,dd,lid): # select関数 22 connection = pymysql.connect( 23 host='localhost', 24 user='hit', 25 password='hit', 26 db='THT', 27 charset='utf8', 28 cursorclass=pymysql.cursors.DictCursor) 29 30 with connection.cursor() as cursor: 31 FROM = yyyy+"-"+MM+"-"+dd+" 00:00:00" 32 TO = yyyy+"-"+MM+"-"+dd+" 23:00:00" 33 sql = "select * from thData where lid="+str(lid) 34 sql += " and date>='"+FROM+"' and date<='"+TO+"'" 35 print("sql=",sql) 36 37 cursor.execute(sql) 38 results = cursor.fetchall() 39 #for r in results: print(r) 40 return results 41#-------------------------------------------------------------------- 42def make_graph(): # make_graph関数 43 #print("<< make_graph start >>") 44 x = [0]*24 45 y1 = [None]*24 46 y2 = [0]*24 47 yyyy = cb1.get() 48 m = int(cb2.get()) 49 d = int(cb3.get()) 50 MM = "{:02d}".format(m) 51 dd = "{:02d}".format(d) 52 lid = 1 53 54 #print("yyyy=",yyyy," ",type(yyyy)) 55 #print("MM=",MM," ",type(MM)) 56 #print("dd=",dd," ",type(dd)) 57 58 #-------------------------------- 59 results = select(yyyy,MM,dd,lid) 60 #-------------------------------- 61 for i in range(0,24): x[i]=i 62 num = len(results) 63 print("num=",num) 64 if num == 0: y1 = [None]*24 65 66 for i in range(num): 67 if i > 23: break 68 69 temp = results[i].get('temp') 70 hcount = results[i].get('hcount') 71 print(i," ",temp," ",hcount) 72 y1[i] = temp 73 y2[i] = hcount 74 75 ax1.cla() 76 ax1.set_xlabel('Hour (H)') 77 ax1.set_ylabel('Temperature (deg)') 78 ax1.set_ylim(-5,25) 79 ax1.plot(x,y1,color="blue",marker="o") 80 81 ax2.cla() 82 ax2.set_ylabel('Human detected (number)',color="red") 83 ax2.set_ylim(0,65) 84 ax2.bar(x,y2,color="red") 85 86 canvas.draw() 87 #print("<< make_graph end >>") 88 89#----------------------------------------------------------------- 90x = [0]*24 91y1 = [None]*24 92y2 = [0]*24 93 94root = tk.Tk() 95root.title("TEST") 96root.geometry("650x580") 97 98frame1 = tk.LabelFrame( 99root,labelanchor="nw", 100text="Temperture & Human Sensor",foreground="green") 101# フレーム1 102frame1.grid(rowspan=2,column=0) 103 104frame2=tk.LabelFrame(root,text="Control", foreground="red") 105 106frame2.grid(row=2,column=0,sticky="nwse") 107 108fig = plt.Figure() 109ax1 = fig.add_subplot(111) 110 111ax1.plot(x,y1) 112ax1.set_xlabel('Hour (H)') 113ax1.set_ylabel('Temperature (deg)') 114ax1.set_ylim(-5,25) 115 116ax2 = ax1.twinx() 117ax2.bar(x,y2,color="red") 118ax2.set_ylabel('Human detected (number)',color="red") 119ax2.set_ylim(0,65) 120 121canvas = FigureCanvasTkAgg(fig, master=frame1) 122# キャンバスのインスタンス化 123canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) 124 125now = datetime.now() 126date = "{:%Y-%m-%d}".format(now) 127month = now.month 128day = now.day 129 130years = ["2020","2021","2022","2023","2024","2025"] 131# 年(コンボボックス) 132months = [1]*12 133for i in range(12) : months[i]=i+1 134days = [1]*31 135for i in range(31) : days[i]=i+1 136devices = ["810C3B31","790A2D12"] 137 138lb1 = tk.Label(frame2, text="year:",bg="cyan") 139cb1 = ttk.Combobox(frame2, values=years,width=6,justify=tk.CENTER) 140cb1.current(0) 141 142lb2 = tk.Label(frame2, text="month:",bg="cyan") 143cb2 = ttk.Combobox(frame2, values = months,width=6,justify=tk.CENTER) 144cb2.current(month-1) 145 146lb3 = tk.Label(frame2, text="day:",bg="cyan") # ラベル3(lb3) 147cb3 = ttk.Combobox(frame2, values = days,width=6,justify=tk.CENTER) 148cb3.current(day-1) 149lb4 = tk.Label(frame2, text="Device ID :",bg="cyan") 150cb4 = ttk.Combobox(frame2, values= devices,width=6,justify=tk.CENTER) 151cb4.current(0) 152 153y = cb1.current() 154m = cb2.current() 155d = cb3.current() 156selected_date = str(years[y])+"-"+str(months[m])+"-"+str(days[d]) 157print("selected_date=",selected_date) 158 159 160 161print("cb1=",cb1.get()," ",end="") 162print("cb2=",cb2.get()," ",end="") 163print("cb3=",cb3.get()) 164 165bt1 = tk.Button(frame2, text="Display", bg="yellow",command=make_graph) 166 167lb1.grid(row=1, column=0 ,padx=5, pady=5) 168cb1.grid(row=1, column=1 ,padx=5, pady=5) 169lb2.grid(row=1, column=2 ,padx=5, pady=5) 170cb2.grid(row=1, column=3 ,padx=5, pady=5) 171lb3.grid(row=1, column=4 ,padx=5, pady=5) 172cb3.grid(row=1, column=5 ,padx=5, pady=5) 173lb4.grid(row=1, column=6 ,padx=5, pady=5) 174cb4.grid(row=1, column=7 ,padx=5, pady=5) 175bt1.grid(row=1, column=8 ,padx=5, pady=5) 176 177make_graph() 178 179root.mainloop()

試したこと
lid = cb4.get()とした。devices = ["1","2"]等の数字のみでは、この書き換えて出来たが
810C3B31、790A2D12の文字を含むとエラーが出る。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

attakei

2021/10/29 11:48 編集

質問内にてコードと思われる部分が、コードブロックで囲まれていません。 そのため、一見してどのようなコードを書いているのかが判別できません。 以下URLの内容などを確認しつつ、コードの内状況がわかるように編集してください。 https://teratail.com/help/question-tips#questionTips3-5-1 ※Pythonは言語構造としてインデントをブロックとみなすため、インデントの状況が不明瞭だと「何もわからない」と言っていい状態になります
hinata_0123

2021/10/29 11:55

ご返信ありがとうございます。編集致しました。
guest

回答1

0

エラー出力についての内容が質問にないことと、細かい挙動の確認まではしてませんが、
select()内で組み立ててるクエリが変です。

diff

1def select(yyyy,MM,dd,lid): # select関数 2 connection = pymysql.connect( 3 host='localhost', 4 user='hit', 5 password='hit', 6 db='THT', 7 charset='utf8', 8 cursorclass=pymysql.cursors.DictCursor) 9 10 with connection.cursor() as cursor: 11 FROM = yyyy+"-"+MM+"-"+dd+" 00:00:00" 12 TO = yyyy+"-"+MM+"-"+dd+" 23:00:00" 13+ # lidに文字列が来るならクオートが必要 14+ sql = "select * from thData where lid= '"+ str(lid) + "'" 15- sql = "select * from thData where lid="+str(lid) 16 sql += " and date>='"+FROM+"' and date<='"+TO+"'" 17 print("sql=",sql) 18 19 cursor.execute(sql) 20 results = cursor.fetchall() 21 #for r in results: print(r) 22 return results

lidとして1が来る分にはlid=1で整数の1とみなされますが、810C3B31だとlid=810C3B31なのでSQLとしては文法エラーのはず。

補足

PyMySQLを使うのであれば、パラメーター形式で渡せるのでこっちを使ったほうが安全(エラーが起きにくい)かと思います。

ドキュメントをもと、試しに書いてみた例(動作確認してません)

python

1def select(yyyy,MM,dd,lid): # select関数 2 connection = pymysql.connect() 3 4 with connection.cursor() as cursor: 5 FROM = yyyy+"-"+MM+"-"+dd+" 00:00:00" 6 TO = yyyy+"-"+MM+"-"+dd+" 23:00:00" 7 8 sql = "select * from thData where lid = %s and date >= %s and date <= %s" 9 cursor.execute(sql, [lid, FROM, TO]) 10 results = cursor.fetchall() 11 return results

投稿2021/10/29 13:06

編集2021/10/29 13:43
attakei

総合スコア2740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hinata_0123

2021/10/30 04:31

ありがとうございます。解答して頂いた方法で出来たのですが、グラフが表示されませんでした。1には810C3EDC、2には790A2D12が対応しており、コンボボックスで810C3EDCと790A2D12を切り替えることで、グラフを表示させたいです。
attakei

2021/10/31 02:58

私には、 > 1には810C3EDC、2には790A2D12が対応しており を実現しようとしている箇所が見当たらないので、まずはこうなるように実装するところから始めてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問