質問編集履歴
9
変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -76,7 +76,9 @@
|
|
76
76
|
print(e, type(e))
|
77
77
|
else:
|
78
78
|
if data == "SELECT":
|
79
|
-
select()
|
79
|
+
threading.Thread(target=select, daemon=True).start()
|
80
|
+
elif data == "CANCEL":
|
81
|
+
threading.Thread(target=cancel, daemon=True).start()
|
80
82
|
|
81
83
|
time.sleep(0.1)
|
82
84
|
|
@@ -92,14 +94,15 @@
|
|
92
94
|
except Exception as e:
|
93
95
|
print(e, type(e))
|
94
96
|
else:
|
95
|
-
if data == "CANCEL":
|
96
|
-
|
97
|
+
pass
|
97
98
|
|
98
99
|
time.sleep(0.1)
|
99
100
|
|
100
101
|
|
101
102
|
def select():
|
102
103
|
global con, cur
|
104
|
+
|
105
|
+
print("select()")
|
103
106
|
|
104
107
|
try:
|
105
108
|
with psycopg2.connect(
|
@@ -130,6 +133,8 @@
|
|
130
133
|
def cancel():
|
131
134
|
global con
|
132
135
|
|
136
|
+
print("cancel()")
|
137
|
+
|
133
138
|
if con:
|
134
139
|
con.cancel()
|
135
140
|
|
@@ -141,9 +146,10 @@
|
|
141
146
|
|
142
147
|
|
143
148
|
def on_button2():
|
144
|
-
global gval
|
149
|
+
global gval1
|
145
150
|
|
146
|
-
gval
|
151
|
+
gval1.put("CANCEL")
|
152
|
+
|
147
153
|
|
148
154
|
def on_close():
|
149
155
|
global monitor_flag1, monitor_flag2, con
|
8
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -52,6 +52,7 @@
|
|
52
52
|
メモ
|
53
53
|
|
54
54
|
psycopg2のキャンセルサンプル。
|
55
|
+
ボタン1を押すと、SELECTクエリ実行。ボタン2を押すと、クエリ中断。
|
55
56
|
(これを画面遷移と組み合わせるのが課題)
|
56
57
|
```Python
|
57
58
|
import queue
|
7
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -54,6 +54,7 @@
|
|
54
54
|
psycopg2のキャンセルサンプル。
|
55
55
|
(これを画面遷移と組み合わせるのが課題)
|
56
56
|
```Python
|
57
|
+
import queue
|
57
58
|
import threading
|
58
59
|
import time
|
59
60
|
import tkinter as tk
|
@@ -66,30 +67,34 @@
|
|
66
67
|
global monitor_flag1, gval1
|
67
68
|
|
68
69
|
while monitor_flag1:
|
70
|
+
try:
|
71
|
+
data = gval1.get_nowait()
|
72
|
+
except queue.Empty as e:
|
73
|
+
pass
|
74
|
+
except Exception as e:
|
75
|
+
print(e, type(e))
|
76
|
+
else:
|
77
|
+
if data == "SELECT":
|
78
|
+
select()
|
79
|
+
|
69
80
|
time.sleep(0.1)
|
70
|
-
|
71
|
-
if not gval1:
|
72
|
-
continue
|
73
|
-
|
74
|
-
data = gval1.pop()
|
75
|
-
|
76
|
-
if data == "SELECT":
|
77
|
-
select()
|
78
81
|
|
79
82
|
|
80
83
|
def monitor_variable2():
|
81
84
|
global monitor_flag2, gval2
|
82
85
|
|
83
86
|
while monitor_flag2:
|
87
|
+
try:
|
88
|
+
data = gval2.get_nowait()
|
89
|
+
except queue.Empty as e:
|
90
|
+
pass
|
91
|
+
except Exception as e:
|
92
|
+
print(e, type(e))
|
93
|
+
else:
|
94
|
+
if data == "CANCEL":
|
95
|
+
cancel()
|
96
|
+
|
84
97
|
time.sleep(0.1)
|
85
|
-
|
86
|
-
if not gval2:
|
87
|
-
continue
|
88
|
-
|
89
|
-
data = gval2.pop()
|
90
|
-
|
91
|
-
if data == "CANCEL":
|
92
|
-
cancel()
|
93
98
|
|
94
99
|
|
95
100
|
def select():
|
@@ -131,14 +136,13 @@
|
|
131
136
|
def on_button1():
|
132
137
|
global gval1
|
133
138
|
|
134
|
-
gval1.
|
139
|
+
gval1.put("SELECT")
|
135
140
|
|
136
141
|
|
137
142
|
def on_button2():
|
138
143
|
global gval2
|
139
144
|
|
140
|
-
gval2.
|
145
|
+
gval2.put("CANCEL")
|
141
|
-
|
142
146
|
|
143
147
|
def on_close():
|
144
148
|
global monitor_flag1, monitor_flag2, con
|
@@ -154,8 +158,8 @@
|
|
154
158
|
|
155
159
|
|
156
160
|
if __name__ == "__main__":
|
157
|
-
gval1 =
|
161
|
+
gval1 = queue.Queue()
|
158
|
-
gval2 =
|
162
|
+
gval2 = queue.Queue()
|
159
163
|
monitor_flag1= True
|
160
164
|
monitor_flag2= True
|
161
165
|
con = None
|
6
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -110,6 +110,9 @@
|
|
110
110
|
results = cur.fetchall()
|
111
111
|
print("rows: {}".format(len(results)))
|
112
112
|
|
113
|
+
except psycopg2.errors.QueryCanceled as e:
|
114
|
+
print("cancel")
|
115
|
+
|
113
116
|
except Exception as e:
|
114
117
|
print(type(e), e)
|
115
118
|
|
@@ -121,7 +124,6 @@
|
|
121
124
|
def cancel():
|
122
125
|
global con
|
123
126
|
|
124
|
-
print("cancel")
|
125
127
|
if con:
|
126
128
|
con.cancel()
|
127
129
|
|
5
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -137,6 +137,7 @@
|
|
137
137
|
|
138
138
|
gval2.append("CANCEL")
|
139
139
|
|
140
|
+
|
140
141
|
def on_close():
|
141
142
|
global monitor_flag1, monitor_flag2, con
|
142
143
|
|
4
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -51,7 +51,8 @@
|
|
51
51
|
### 追記
|
52
52
|
メモ
|
53
53
|
|
54
|
-
psycopg2のキャンセルサンプル
|
54
|
+
psycopg2のキャンセルサンプル。
|
55
|
+
(これを画面遷移と組み合わせるのが課題)
|
55
56
|
```Python
|
56
57
|
import threading
|
57
58
|
import time
|
@@ -61,83 +62,106 @@
|
|
61
62
|
import psycopg2
|
62
63
|
|
63
64
|
|
64
|
-
def monitor_variable():
|
65
|
+
def monitor_variable1():
|
65
|
-
global monitor_flag, gval
|
66
|
+
global monitor_flag1, gval1
|
66
67
|
|
67
|
-
while monitor_flag:
|
68
|
+
while monitor_flag1:
|
68
69
|
time.sleep(0.1)
|
69
70
|
|
70
|
-
if not gval:
|
71
|
+
if not gval1:
|
71
72
|
continue
|
72
73
|
|
73
|
-
data = gval.pop()
|
74
|
+
data = gval1.pop()
|
74
75
|
|
75
76
|
if data == "SELECT":
|
76
|
-
|
77
|
+
select()
|
77
78
|
|
78
79
|
|
80
|
+
def monitor_variable2():
|
81
|
+
global monitor_flag2, gval2
|
82
|
+
|
83
|
+
while monitor_flag2:
|
84
|
+
time.sleep(0.1)
|
85
|
+
|
86
|
+
if not gval2:
|
87
|
+
continue
|
88
|
+
|
89
|
+
data = gval2.pop()
|
90
|
+
|
91
|
+
if data == "CANCEL":
|
92
|
+
cancel()
|
93
|
+
|
94
|
+
|
79
|
-
def
|
95
|
+
def select():
|
80
96
|
global con, cur
|
81
97
|
|
82
98
|
try:
|
83
|
-
|
99
|
+
with psycopg2.connect(
|
84
100
|
host = "192.168.0.100",
|
85
101
|
user = "user01",
|
86
102
|
password = "pass01",
|
87
103
|
dbname = "testdb"
|
88
|
-
)
|
104
|
+
) as con:
|
89
105
|
|
90
|
-
|
106
|
+
with con.cursor() as cur:
|
91
|
-
|
92
|
-
print("Q
|
107
|
+
print("SQL...")
|
93
|
-
sql = "SELECT * FROM testview;"
|
108
|
+
sql = "SELECT * FROM testview;"
|
94
|
-
cur.execute(sql)
|
109
|
+
cur.execute(sql)
|
95
|
-
results = cur.fetchall()
|
110
|
+
results = cur.fetchall()
|
96
|
-
print("rows: {}".format(len(results)))
|
111
|
+
print("rows: {}".format(len(results)))
|
97
|
-
|
98
|
-
cur = None
|
99
|
-
con = None
|
100
|
-
|
101
|
-
cur.close()
|
102
|
-
con.close()
|
103
112
|
|
104
113
|
except Exception as e:
|
105
114
|
print(type(e), e)
|
115
|
+
|
116
|
+
finally:
|
117
|
+
con = None
|
106
118
|
cur = None
|
119
|
+
|
120
|
+
|
121
|
+
def cancel():
|
107
|
-
|
122
|
+
global con
|
123
|
+
|
124
|
+
print("cancel")
|
125
|
+
if con:
|
126
|
+
con.cancel()
|
108
127
|
|
109
128
|
|
110
129
|
def on_button1():
|
111
|
-
global gval
|
130
|
+
global gval1
|
112
131
|
|
113
|
-
gval.append("SELECT")
|
132
|
+
gval1.append("SELECT")
|
114
133
|
|
115
134
|
|
116
135
|
def on_button2():
|
117
|
-
global
|
136
|
+
global gval2
|
118
137
|
|
119
|
-
if con:
|
120
|
-
|
138
|
+
gval2.append("CANCEL")
|
121
139
|
|
122
140
|
def on_close():
|
123
|
-
global monitor_flag, con
|
141
|
+
global monitor_flag1, monitor_flag2, con
|
124
142
|
|
125
143
|
if con:
|
126
144
|
return
|
127
145
|
|
128
|
-
monitor_flag = False
|
146
|
+
monitor_flag1 = False
|
147
|
+
monitor_flag2 = False
|
129
|
-
thread.join()
|
148
|
+
thread1.join()
|
149
|
+
thread2.join()
|
130
150
|
root.destroy()
|
131
151
|
|
132
152
|
|
133
153
|
if __name__ == "__main__":
|
134
|
-
gval = []
|
154
|
+
gval1 = []
|
155
|
+
gval2 = []
|
135
|
-
monitor_flag
|
156
|
+
monitor_flag1= True
|
157
|
+
monitor_flag2= True
|
136
158
|
con = None
|
137
159
|
cur = None
|
138
160
|
|
139
|
-
thread = threading.Thread(target=monitor_variable)
|
161
|
+
thread1 = threading.Thread(target=monitor_variable1)
|
162
|
+
thread2 = threading.Thread(target=monitor_variable2)
|
140
|
-
thread.start()
|
163
|
+
thread1.start()
|
164
|
+
thread2.start()
|
141
165
|
|
142
166
|
root = tk.Tk()
|
143
167
|
|
3
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -90,7 +90,7 @@
|
|
90
90
|
cur = con.cursor()
|
91
91
|
|
92
92
|
print("Query...")
|
93
|
-
sql = "SELECT * FROM view
|
93
|
+
sql = "SELECT * FROM testview;"
|
94
94
|
cur.execute(sql)
|
95
95
|
results = cur.fetchall()
|
96
96
|
print("rows: {}".format(len(results)))
|
2
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -48,3 +48,106 @@
|
|
48
48
|
|
49
49
|
ただ、上のコードではDB操作を試みるとアプリが固まってボタンの操作もできなくなるので、[過去の質問](https://teratail.com/questions/296608)の回答にある実装方法に変えるつもりでいます。(GUIを動かすメインスレッドとは別のスレッドをガン回しする)
|
50
50
|
|
51
|
+
### 追記
|
52
|
+
メモ
|
53
|
+
|
54
|
+
psycopg2のキャンセルサンプル
|
55
|
+
```Python
|
56
|
+
import threading
|
57
|
+
import time
|
58
|
+
import tkinter as tk
|
59
|
+
from tkinter import ttk
|
60
|
+
|
61
|
+
import psycopg2
|
62
|
+
|
63
|
+
|
64
|
+
def monitor_variable():
|
65
|
+
global monitor_flag, gval
|
66
|
+
|
67
|
+
while monitor_flag:
|
68
|
+
time.sleep(0.1)
|
69
|
+
|
70
|
+
if not gval:
|
71
|
+
continue
|
72
|
+
|
73
|
+
data = gval.pop()
|
74
|
+
|
75
|
+
if data == "SELECT":
|
76
|
+
func()
|
77
|
+
|
78
|
+
|
79
|
+
def func():
|
80
|
+
global con, cur
|
81
|
+
|
82
|
+
try:
|
83
|
+
con = psycopg2.connect(
|
84
|
+
host = "192.168.0.100",
|
85
|
+
user = "user01",
|
86
|
+
password = "pass01",
|
87
|
+
dbname = "testdb"
|
88
|
+
)
|
89
|
+
|
90
|
+
cur = con.cursor()
|
91
|
+
|
92
|
+
print("Query...")
|
93
|
+
sql = "SELECT * FROM view_direction_plan;"
|
94
|
+
cur.execute(sql)
|
95
|
+
results = cur.fetchall()
|
96
|
+
print("rows: {}".format(len(results)))
|
97
|
+
|
98
|
+
cur = None
|
99
|
+
con = None
|
100
|
+
|
101
|
+
cur.close()
|
102
|
+
con.close()
|
103
|
+
|
104
|
+
except Exception as e:
|
105
|
+
print(type(e), e)
|
106
|
+
cur = None
|
107
|
+
con = None
|
108
|
+
|
109
|
+
|
110
|
+
def on_button1():
|
111
|
+
global gval
|
112
|
+
|
113
|
+
gval.append("SELECT")
|
114
|
+
|
115
|
+
|
116
|
+
def on_button2():
|
117
|
+
global con
|
118
|
+
|
119
|
+
if con:
|
120
|
+
con.cancel()
|
121
|
+
|
122
|
+
def on_close():
|
123
|
+
global monitor_flag, con
|
124
|
+
|
125
|
+
if con:
|
126
|
+
return
|
127
|
+
|
128
|
+
monitor_flag = False
|
129
|
+
thread.join()
|
130
|
+
root.destroy()
|
131
|
+
|
132
|
+
|
133
|
+
if __name__ == "__main__":
|
134
|
+
gval = []
|
135
|
+
monitor_flag = True
|
136
|
+
con = None
|
137
|
+
cur = None
|
138
|
+
|
139
|
+
thread = threading.Thread(target=monitor_variable)
|
140
|
+
thread.start()
|
141
|
+
|
142
|
+
root = tk.Tk()
|
143
|
+
|
144
|
+
button1 = ttk.Button(root, text="Button1", command=on_button1)
|
145
|
+
button1.grid()
|
146
|
+
|
147
|
+
button2 = ttk.Button(root, text="Button2", command=on_button2)
|
148
|
+
button2.grid()
|
149
|
+
|
150
|
+
root.protocol("WM_DELETE_WINDOW", on_close)
|
151
|
+
root.mainloop()
|
152
|
+
```
|
153
|
+
|
1
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -46,5 +46,5 @@
|
|
46
46
|
root.mainloop()
|
47
47
|
```
|
48
48
|
|
49
|
-
ただ、上のコードではDB操作を試みるとアプリが固まってボタンの操作もできなくなるので、[過去の質問](https://teratail.com/questions/296608)の実装方法に変えるつもりでいます。
|
49
|
+
ただ、上のコードではDB操作を試みるとアプリが固まってボタンの操作もできなくなるので、[過去の質問](https://teratail.com/questions/296608)の回答にある実装方法に変えるつもりでいます。(GUIを動かすメインスレッドとは別のスレッドをガン回しする)
|
50
50
|
|