Skip to content

Commit 1882706

Browse files
committed
tkinter
1 parent 7e84a82 commit 1882706

File tree

31 files changed

+261
-0
lines changed

31 files changed

+261
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import tkinter as tk
2+
from PIL import ImageTk, Image
3+
4+
# --- functions ---
5+
6+
def on_resize(event):
7+
# it respects anchor
8+
x = event.width/2
9+
y = event.height/2
10+
stage.coords(img_id, x, y)
11+
12+
# it DOESN'T respects anchor so you have to add offset
13+
#x = (event.width - imgtk.width())/2
14+
#y = (event.height - imgtk.height())/2
15+
#stage.moveto(img_id, x, y) # doesn't respect anchor
16+
17+
#stage.itemconfigure(img_id, ...)
18+
19+
# --- main ---
20+
21+
root = tk.Tk()
22+
23+
stage = tk.Canvas(root, width=1000, height=700)
24+
stage.pack(fill='both', expand=True)
25+
26+
#root.update() # force `mainloop()` to calculate current `width`, `height` for canvas
27+
# and later `stage.winfo_width()` `stage.winfo_height()` will get correct values instead `0`
28+
29+
#imgtk = ImageTk.PhotoImage(Image.open('lenna.png'))
30+
imgtk = ImageTk.PhotoImage(file='lenna.png')
31+
32+
img_id = stage.create_image((stage.winfo_width()/2, stage.winfo_height()/2), image=imgtk, anchor='center')
33+
stage.image = imgtk
34+
35+
stage.bind('<Configure>', on_resize) # it runs function when Canvas change size,
36+
# it runs function also at start so it doesn't need `root.update()`
37+
root.mainloop()
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# author: Bartlomiej "furas" Burek (https://blog.furas.pl)
2+
# date: 2022.04.13
3+
# [python - Problem when I log into Facebook in Tkinter and Selenium, using the textboxes for user and password - Stack Overflow](https://stackoverflow.com/questions/71854285/problem-when-i-log-into-facebook-in-tkinter-and-selenium-using-the-textboxes-fo/)
4+
import os
5+
import tkinter as tk
6+
from tkinter import ttk
7+
8+
from selenium.webdriver import Firefox
9+
from selenium.webdriver.firefox.service import Service
10+
from selenium.webdriver.firefox.options import Options
11+
from selenium.webdriver.support.ui import WebDriverWait
12+
from selenium.webdriver.common.by import By
13+
from selenium.webdriver.support import expected_conditions as EC
14+
15+
# --- functions ---
16+
17+
def login():
18+
profile_path = '/usr/bin/firefox/firefox'
19+
20+
options = Options()
21+
options.set_preference('profile', profile_path)
22+
options.set_preference('network.proxy.type', 4)
23+
options.set_preference('network.proxy.socks', '127.0.0.1')
24+
options.set_preference('network.proxy.socks_port', 9050)
25+
options.set_preference("network.proxy.socks_remote_dns", False)
26+
27+
#service = Service('/home/jass/bin/geckodriver')
28+
service = Service('/home/furas/bin/geckodriver')
29+
driver = Firefox(service=service, options=options)
30+
driver.get("https://www.facebook.com")
31+
32+
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-cookiebanner="accept_only_essential_button"]'))).click()
33+
34+
username_box = driver.find_element(By.ID, 'email')
35+
username_box.send_keys(email.get())
36+
37+
password_box = driver.find_element(By.ID, 'pass')
38+
password_box.send_keys(password.get())
39+
40+
login_box = driver.find_element(By.ID, 'loginbutton')
41+
login_box.click()
42+
43+
# --- main ---
44+
45+
root = tk.Tk()
46+
root.title("Login")
47+
root.geometry('630x500')
48+
49+
topbar = tk.Frame(root, bg='#3c5999', height=42)
50+
topbar.pack(fill='x')
51+
52+
label_email = tk.Label(topbar, text="email", bg='#3c5999', foreground="white")
53+
label_email.place(x=2, y=10)
54+
55+
email = tk.Entry(topbar)
56+
email.place(x=50, y=9)
57+
58+
label_password = tk.Label(topbar, text="password", bg='#3c5999', foreground="white")
59+
label_password.place(x=260, y=10)
60+
61+
password = tk.Entry(topbar)
62+
password.place(x=335, y=9)
63+
64+
button = tk.Button(topbar, text="Login", bg='white', foreground='black', width=7, command=login)
65+
button.place(x=530, y=5)
66+
67+
root.mainloop()

tkinter/simpledialog/main-1.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# author: Bartlomiej "furas" Burek (https://blog.furas.pl)
2+
# date: 2022.04.03
3+
4+
# doc: https://docs.python.org/3/library/dialog.html
5+
6+
# python -m tkinter.simpledialog
7+
8+
# tkinter.simpledialog
9+
# askstring(title, prompt, **kw)
10+
# askinteger(title, prompt, **kw)
11+
# askfloat(title, prompt, **kw)
12+
13+
import tkinter as tk
14+
import tkinter.simpledialog
15+
16+
# source code in file
17+
#print( tkinter.simpledialog.__file__ )
18+
19+
# ---
20+
21+
def show_dialogs():
22+
# it doesn't get `parent` as first argument but it needs to use `parent=`
23+
24+
result = tkinter.simpledialog.askstring('Example askstring ', 'Write text:', parent=root)
25+
print('result:', result, type(result))
26+
27+
result = tkinter.simpledialog.askinteger('Example askinteger', 'Write integer number:', parent=root)
28+
print('result:', result, type(result))
29+
30+
result = tkinter.simpledialog.askfloat('Example askfloat', 'Write float number:', parent=root)
31+
print('result:', result, type(result))
32+
33+
#result = tkinter.simpledialog.askstring('Example askstring ', 'Write password:', show="?", parent=root) # you can set any char (but not 2 chars)
34+
result = tkinter.simpledialog.askstring('Example askstring ', 'Write password:', show="*", parent=root)
35+
print('result:', result, type(result))
36+
37+
# --- main ---
38+
39+
root = tk.Tk()
40+
41+
button = tk.Button(root, text='Show Dialogs', command=show_dialogs)
42+
button.pack()
43+
44+
root.mainloop()
45+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Module [ttkthemes](https://ttkthemes.readthedocs.io/en/latest/index.html)
2+
3+
Screenshots with all themes: [List of ttk Themes](https://wiki.tcl-lang.org/page/List+of+ttk+Themes)
4+
5+
[TkDocs Tutorial - Styles and Themes](https://tkdocs.com/tutorial/styles.html)
6+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# author: Bartlomiej "furas" Burek (https://blog.furas.pl)
2+
# date: 2022.04.04
3+
# [How to change whole app's theme when used within Class, Tkinter, ttkThemes, ThemedTk Python - Stack Overflow](https://stackoverflow.com/questions/71726458/how-to-change-whole-apps-theme-when-used-within-class-tkinter-ttkthemes-them/)
4+
5+
# [List of ttk Themes](https://wiki.tcl-lang.org/page/List+of+ttk+Themes)
6+
7+
import tkinter as tk
8+
import tkinter.ttk as ttk
9+
from ttkthemes import ThemedTk
10+
11+
class App(ThemedTk):
12+
13+
def __init__(self):
14+
super().__init__()
15+
16+
self.geometry("800x600")
17+
18+
self.my_notebook = ttk.Notebook(self)
19+
self.my_notebook.pack(pady=15, fill='both', expand=True)
20+
21+
self.frame = ttk.Frame(self.my_notebook)
22+
self.my_notebook.add(self.frame, text='Buttons')
23+
for number in range(10):
24+
b = ttk.Button(self.frame, text=str(number))
25+
b.pack()
26+
27+
self.my_menu = tk.Menu(self)
28+
self.config(menu=self.my_menu)
29+
30+
self.first_lane = tk.Menu(self.my_menu)
31+
self.first_lane.add_command(label='a')
32+
self.first_lane.add_command(label='b')
33+
self.my_menu.add_cascade(label='Menu1', menu=self.first_lane)
34+
35+
self.second_lane = tk.Menu(self.my_menu)
36+
self.my_menu.add_cascade(label='Menu2', menu=self.second_lane)
37+
38+
self.third_lane = tk.Menu(self.my_menu)
39+
self.my_menu.add_cascade(label='Style', menu=self.third_lane)
40+
41+
for item in sorted(self.get_themes()):
42+
self.third_lane.add_command(label=item, command=lambda name=item: self.changer_theme(name))
43+
44+
def changer_theme(self, name):
45+
print('theme:', name)
46+
self.set_theme(name)
47+
48+
if __name__ == "__main__":
49+
app = App()
50+
app.mainloop()
51+
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# author: Bartlomiej "furas" Burek (https://blog.furas.pl)
2+
# date: 2022.04.04
3+
# [How to change whole app's theme when used within Class, Tkinter, ttkThemes, ThemedTk Python - Stack Overflow](https://stackoverflow.com/questions/71726458/how-to-change-whole-apps-theme-when-used-within-class-tkinter-ttkthemes-them/)
4+
5+
# [List of ttk Themes](https://wiki.tcl-lang.org/page/List+of+ttk+Themes)
6+
# [TkDocs Tutorial - Styles and Themes](https://tkdocs.com/tutorial/styles.html)
7+
8+
import tkinter as tk
9+
import tkinter.ttk as ttk
10+
from ttkthemes import ThemedStyle
11+
12+
class App(tk.Tk):
13+
14+
def __init__(self):
15+
super().__init__()
16+
17+
self.geometry("800x600")
18+
19+
self.style = ThemedStyle() # with Tk and ThemedStyle
20+
21+
self.my_notebook = ttk.Notebook(self)
22+
self.my_notebook.pack(pady=15, fill='both', expand=True)
23+
24+
self.frame = ttk.Frame(self.my_notebook)
25+
self.my_notebook.add(self.frame, text='Buttons')
26+
for number in range(10):
27+
b = ttk.Button(self.frame, text=str(number))
28+
b.pack()
29+
30+
self.my_menu = tk.Menu(self)
31+
self.config(menu=self.my_menu)
32+
33+
self.first_lane = tk.Menu(self.my_menu)
34+
self.first_lane.add_command(label='a')
35+
self.first_lane.add_command(label='b')
36+
self.my_menu.add_cascade(label='Menu1', menu=self.first_lane)
37+
38+
self.second_lane = tk.Menu(self.my_menu)
39+
self.my_menu.add_cascade(label='Menu2', menu=self.second_lane)
40+
41+
self.third_lane = tk.Menu(self.my_menu)
42+
self.my_menu.add_cascade(label='Style', menu=self.third_lane)
43+
44+
#for item in self.get_themes(): # with ThemedTk
45+
for item in self.style.get_themes(): # with Tk and ThemedStyle
46+
self.third_lane.add_command(label=item, command=lambda name=item: self.changer_theme(name))
47+
48+
def changer_theme(self, name):
49+
print('theme:', name)
50+
#self.set_theme(name) # with ThemedTk
51+
self.style.theme_use(name) # with Tk and ThemedStyle
52+
53+
if __name__ == "__main__":
54+
app = App()
55+
app.mainloop()

0 commit comments

Comments
 (0)