tk WUTYEWCIE

A Community Python Project To Make Python Programming The Easiest As Possible To Do
mail@pastecode.io avatar
unknown
python
17 days ago
10 kB
6
Indexable
Never
# tk_WUTYEWCIE.py

'''
About: A Community Python Project To Make Python Programming The Easiest As Possible To Do
'''

import tkinter as tk
from tkinter import *
from tkinter import ttk, colorchooser, font
from random import choice, randint
import itertools
import re

root = tk.Tk()
root.title("Widget Demo")
root.geometry(f"+{100}+{5}")
root.resizable(False, False)
root.attributes('-topmost', True)

def pick_color(color_var):
	color = colorchooser.askcolor()[1]
	if color:
		color_var.set(color)

def oMenu(label, v1, v2, cmd=None):
	try:
		vals = [v2[0]] + v2
	except:
		vals = []
	return ttk.OptionMenu(label, v1, *vals, command=cmd)

def xMenu(label, v1, v2, cmd=None):
	geom = root.geometry()		
	w, h, x, y = map(int, re.findall(r"(\d+)", geom))
	label.grid(row=r, column=1)
	menu_frame = Frame(label)
	menu_frame.grid(row=rrr(), column=1, sticky=E)
	menu_window = Toplevel(label)
	menu_window.overrideredirect(True)
	menu_window.resizable(False, False)
	root.attributes('-topmost', False)
	menu_window.attributes('-topmost', True)
		
	listbox_frame = Frame(menu_window)
	listbox_frame.pack()

	scrollbar = Scrollbar(listbox_frame, orient=tk.VERTICAL)
	listbox = Listbox(listbox_frame, height=42)
	scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

	listbox.config(yscrollcommand=scrollbar.set)
	listbox.pack(side=tk.LEFT, fill=tk.BOTH)
	scrollbar.config(command=listbox.yview)

	for item in v2:
		listbox.insert(END, item)
		
	def on_leave(event):
		x = root.winfo_pointerx()
		geom = menu_window.geometry()
		w, h, x2, y2 = map(int, re.findall(r"(\d+)", geom))
		if not (x2 < x < x2 + w + 50):
			menu_window.destroy()
		root.attributes('-topmost', True)

	def on_select(event):
		selected = listbox.get(listbox.curselection())
		v1.set(selected)
		menu_window.destroy()
		
	listbox.bind("<Leave>", on_leave)
	listbox.bind('<<ListboxSelect>>', on_select)
	listbox.config(width=30)
	
	menu_window.geometry(f"+{x+80}+{10}")

def create_beveled_button(parent, text_var, command):
    label = tk.Label(parent, textvariable=text_var,
                     relief=tk.RAISED, borderwidth=2, padx=5, pady=5,
                     bg="#e1e1e1", fg="#000000")
    label.bind("<Button-1>", command)
    return label
	
def toggle_widgets(widget, target, bit='disabled'):
	if target in str(widget).lower():
		try:
			widget.config(state='!disabled')
		except:
			pass
		if isinstance(widget, Entry):
			widget.delete(0, END)
		elif isinstance(widget, Text):
			widget.delete(1.0, END)
		try:
			widget.config(state=bit)
		except:
			pass

	for child in widget.winfo_children():
		toggle_widgets(child, target, bit)

def apply_syntax():
    selected = selected_widget.get()
    options = {}

    for option in primary_options_list:
        if option in menu_widget:
            option_widget = menu_widget[option]
            if option_label[option].cget('state') != 'disabled':
                if isinstance(option_widget, ttk.OptionMenu):
                    value_var = next((var for var in menu_sVar.values() if option in var.get()), None)
                    options[option] = value_var.get() if value_var else ""
                else:
                    try:
                        options[option] = option_widget.get()
                    except:
                        continue
        elif option in option_label:
            option_widget = option_label[option]
            if option_widget.cget('state') != 'disabled':
                try:
                    options[option] = option_widget.get()
                except:
                    continue

    syntax = f"{selected}(root, " + ", ".join(f"{key}='{val}'" for key, val in options.items() if val) + ")"
    print(syntax)
	
def randomly_create_data(e=None):			
	toggle_widgets(root, "", 'disabled')
	selected_widget_menu.config(state='normal')
	apply_button.config(state='normal')
	x, y = [randint(1, 20) * 5 for i in range(2)]
	width, height = [randint(1, 20) * 5 for i in range(2)]
	options = {
		'x': x,
		'y': y,
		'width': width,
		'height': height,
		'text': ''.join(choice('qwrtypdfghjkzxvbnm') for _ in range(16)),
		'font': choice(font_list),
		'command': choice('copy cut paste exit None'.split()),
		'image': choice('gif jpg png None'.split()),
		'relief': choice(relief_list),
		'state': choice(state_list),
		'justify': choice(justify_list),
		'anchor': choice(anchor_list),
		'fg': '#000000',
		'bg': '#ffffff',
		'padx': '',
		'pady': '',
		'wrap': '',
		'wraplength': ''
	}

	selected = selected_widget.get()
	try:
		widget_keys = eval(selected+'().config().keys()')
	except:
		widget_keys = eval(selected+'(root).config().keys()')

	for xy in 'xy':
		option_widget = options_label.grid_slaves(row=primary_options_list.index(xy)+1, column=1)[0]
		option_widget.config(state='normal')
		option_widget.delete(0, END)
		option_widget.insert(0, eval(xy))

	for option in options:
		option_widget = menu_widget[option]
		try:
			menu_sVar[option].set('...')
		except:
			0
		if option in widget_keys:
			if option in ('font'):
				menu_widget['size']['state'] = 'normal'
				menu_sVar['size'].set(choice(size_options))
				menu_widget['style']['state'] = 'normal'
				menu_sVar['style'].set(choice(font_styles))
			try:
				menu_sVar[option].set(options[option])
			except:
				0
			try:
				option_label[option].config(state='normal')
			except:
				0
			try:
				option_widget.config(state='normal')
				option_widget.insert(0, options[option])
			except:
				0
			try:
				option_widget.set(options[option])
			except:
				0
		else:
			if option in ('font'):
				menu_widget['size']['state'] = 'normal'
				menu_sVar['size'].set('...')
				menu_widget['style']['state'] = 'normal'
				menu_sVar['style'].set('...')

r = -1
def rrr():
	global r
	r += 1
	return r

option_label = {}
menu_sVar = {}
menu_widget = {}

font_list = list(font.families())

widget_list = [feature for feature in dir(tk) if feature.lower() not in ('image', 'tk', 'ttk')]
widget_list = [feature for feature in widget_list if hasattr(eval(f"tk.{feature}"), 'config')]
widget_list.pop()

primary_options_list = '''
x y width height text font image relief state anchor justify padx pady wrap wraplength fg bg command
'''.strip().split()

state_list = '''
normal active disabled
'''.strip().split()

justify_list = '''
center right left
'''.strip().split()

anchor_list = '''
N NE E SE S SW W NW
'''.strip().split()

relief_list = '''
FLAT RAISED SUNKEN GROOVE RIDGE
'''.strip().split()

primary_options_list = '''
x y width height text font image relief state anchor justify padx pady wrap wraplength fg bg command
'''.strip().split()

size_options = list(range(6, 400))

font_styles = list(itertools.product(['', 'bold'], ['', 'roman', 'italic']))
font_styles = [f"{weight} {slant}".strip() for weight, slant in font_styles]

options_label = LabelFrame(root, text="Selected Widget Options")
options_label.grid(padx=3, pady=5)

selected_widget = StringVar(options_label)
selected_widget_menu = oMenu(options_label, selected_widget, widget_list, randomly_create_data)
selected_widget_menu.grid(row=rrr(), column=1, sticky=E)
selected_widget.set('Canvas')

for option in primary_options_list:
	option_label[option] = Label(options_label, text=option, fg='red')
	option_label[option].grid(row=rrr(), column=0, sticky=E)
	if option == 'font':
		option_label[option].grid(sticky=W)
		menu_sVar[option] = StringVar(options_label)
		menu_widget[option] = oMenu(options_label, menu_sVar[option], font_list)
		menu_widget[option].grid(row=r, column=0, columnspan=2, sticky=E, padx=(24, 0))
		menu_sVar['size'] = StringVar(options_label)
		menu_widget['size'] = oMenu(options_label, menu_sVar['size'], size_options)
		menu_widget['size'].grid(row=rrr(), column=0, columnspan=2, sticky=W)
		menu_sVar['style'] = StringVar(options_label)
		menu_widget['style'] = oMenu(options_label, menu_sVar['style'], font_styles)
		menu_widget['style'].grid(row=r, column=1, columnspan=2, sticky=E)
	elif option == 'relief':
		menu_sVar[option] = StringVar(options_label)
		menu_widget[option] = oMenu(options_label, menu_sVar[option], relief_list)
		menu_widget[option].grid(row=r, column=1, sticky=E)
	elif option == 'state':
		menu_sVar[option] = StringVar(options_label)
		menu_widget[option] = oMenu(options_label, menu_sVar[option], state_list)
		menu_widget[option].grid(row=r, column=1, sticky=E)
	elif option == 'justify':
		menu_sVar[option] = StringVar(options_label)
		menu_widget[option] = oMenu(options_label, menu_sVar[option], justify_list)
		menu_widget[option].grid(row=r, column=1, sticky=E)
	elif option == 'anchor':
		menu_sVar[option] = StringVar(options_label)
		menu_widget[option] = oMenu(options_label, menu_sVar[option], anchor_list)
		menu_widget[option].grid(row=r, column=1, sticky=E)
	elif option in ['fg', 'bg']:
		menu_widget[option] = Entry(options_label, textvariable=option)
		menu_widget[option].grid(row=r, column=1, padx=2, sticky=W)
		canvas_btn = Canvas(options_label, width=72, height=20)
		canvas_btn.grid(row=r, column=1, padx=2, sticky=E)
		canvas_btn.create_rectangle(0, 0, 72, 20, fill='gray', tag='rectangle')
		canvas_btn.create_text(36, 10, text="Pick Color", fill="white", tag='text', anchor='center')
		canvas_btn.bind('<Button-1>', lambda event, c=menu_widget[option]: pick_color(c))
	else:
		menu_widget[option] = Entry(options_label)
		menu_widget[option].grid(row=r, column=1, padx=2, sticky='ew')

xm, ym = 0, 0
def on_pressed(event):
	global xm, ym
	xm, ym = event.x, event.y

def on_motion(event):
	x = root.winfo_x() - xm + event.x
	y = root.winfo_y() - ym + event.y
	root.geometry(f"+{x}+{y}")
		
apply_button = Button(options_label, text="Apply", command=apply_syntax)
apply_button.grid(row=rrr(), column=0, sticky='ew')

root.bind("<ButtonPress-1>", on_pressed)
root.bind("<B1-Motion>", on_motion)

randomly_create_data()
root.mainloop()
Leave a Comment