VIStk 0.3.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of VIStk might be problematic. Click here for more details.

VIS/Form.zip ADDED
Binary file
@@ -0,0 +1,5 @@
1
+ coll = COLLECT($insert$
2
+ strip=False,
3
+ upx=True,
4
+ upx_exclude=[],
5
+ name='$version$')
@@ -0,0 +1,25 @@
1
+ #Default Imports
2
+ from tkinter import *
3
+ from tkinter import ttk
4
+ from Screens.root import *
5
+ #File Specific Imports
6
+
7
+ #Create Frame
8
+ <frame> = ttk.Frame(root)
9
+ <frame>.grid(column=0,row=0,columnspan=1,rowspan=1,sticky=(N, S, E, W))
10
+
11
+ #Configure Frame Grid
12
+ <frame>.columnconfigure(1,weight=1)
13
+ <frame>.rowconfigure(1,weight=1)
14
+
15
+ #Declare Stringvars
16
+
17
+ #Button Commands and Functions
18
+
19
+ #Navigation
20
+
21
+ #########################
22
+ #####Visual Elements#####
23
+ #########################
24
+
25
+ #Element Descriptions
@@ -0,0 +1,45 @@
1
+ #Default Imports
2
+ from tkinter import *
3
+ from tkinter import ttk
4
+ from Screens.root import *
5
+ import sys
6
+ #File Specific Imports
7
+
8
+ #Configure Screen
9
+ print(cfp)
10
+
11
+ w = 1080
12
+ h = 720
13
+ ws = root.winfo_screenwidth()
14
+ hs = root.winfo_screenheight()
15
+ x = (ws/2) - (w/2)
16
+ y = (hs/2) - (h/2)
17
+ root.geometry('%dx%d+%d+%d' % (w, h, x, y))
18
+ root.title("Placeholder Title")
19
+ root.minsize(1080,720)
20
+ #root.iconbitmap("<project>/Images/Icons/<some_icon>")
21
+
22
+ #Screen Elements
23
+
24
+ #Screen Grid
25
+ root.grid_columnconfigure(0,weight=1)
26
+ root.grid_rowconfigure(0,weight=1)
27
+
28
+ #Screen Modules
29
+
30
+ #Handle Arguments
31
+
32
+ #Define Loop Modules
33
+ def loop():
34
+ #screen modules run here
35
+ 1+1
36
+
37
+ #Update Loop
38
+ while True:
39
+ try:
40
+ if root.winfo_exists():
41
+ try:loop()
42
+ except:pass
43
+ root.update()
44
+ except:
45
+ break
VIS/Templates/spec.txt ADDED
@@ -0,0 +1,33 @@
1
+ $name$_a = Analysis(
2
+ ['../$file$'],
3
+ pathex=[],
4
+ binaries=[],
5
+ datas=[],
6
+ hiddenimports=[],
7
+ hookspath=[],
8
+ hooksconfig={},
9
+ runtime_hooks=[],
10
+ excludes=[],
11
+ noarchive=False,
12
+ optimize=0,)
13
+ $name$_pyz = PYZ($name$_a.pure)
14
+ $name$_exe = EXE(
15
+ $name$_pyz,
16
+ $name$_a.scripts,
17
+ $name$_a.binaries,
18
+ $name$_a.datas,
19
+ [],
20
+ exclude_binaries=True,
21
+ name='$name$',
22
+ debug=False,
23
+ bootloader_ignore_signals=False,
24
+ strip=False,
25
+ upx=True,
26
+ console=False,
27
+ disable_windowed_traceback=False,
28
+ argv_emulation=False,
29
+ target_arch=None,
30
+ codesign_identity=None,
31
+ entitlements_file=None,
32
+ icon=['../Icons/$icon$.ico'],)
33
+
VIS/VIS.py ADDED
@@ -0,0 +1,96 @@
1
+ import sys
2
+ import os
3
+ import zipfile
4
+ import subprocess
5
+ import shutil
6
+ import project as vp
7
+ from importlib import metadata
8
+ import json
9
+
10
+ #Need to get current python location where VIS is installed
11
+ vl = subprocess.check_output('python -c "import os, sys; print(os.path.dirname(sys.executable))"').decode().strip("\r\n")+"\\Lib\\site-packages\\VIS\\"
12
+ #print(vl)
13
+
14
+ inp = sys.argv
15
+ #print("entered ",inp[1]," as ",inp)
16
+ try:
17
+ (wd := os.getcwd()) if inp[1] in ["new","New","N","n"] else (wd := vp.getPath())
18
+ except:
19
+ print(f"VIS Version {metadata.version("VIS")}")
20
+ sys.exit()
21
+
22
+ #Copied from source
23
+ #https://stackoverflow.com/a/75246706
24
+ def unzip_without_overwrite(src_path, dst_dir):
25
+ with zipfile.ZipFile(src_path, "r") as zf:
26
+ for member in zf.infolist():
27
+ file_path = os.path.join(dst_dir, member.filename)
28
+ if not os.path.exists(file_path):
29
+ zf.extract(member, dst_dir)
30
+ def __main__():
31
+ match inp[1]:
32
+ case "new"|"New"|"N"|"n":#Create a new VIS project
33
+ if vp.getPath() == None:
34
+ os.mkdir(wd+"\\.VIS")
35
+ open(wd+"/.VIS/path.cfg","w").write(wd) if os.path.exists(wd+"/.VIS/path.cfg") else open(wd+"/.VIS/path.cfg", 'a').write(wd)
36
+ print(f"Created path.cfg as {vp.getPath()}")
37
+ unzip_without_overwrite(vl.replace("\\","/")+"Form.zip",wd)#Unzip project template to project
38
+ shutil.copytree(vl+"Templates",wd+".VIS/Templates",dirs_exist_ok=True)#copy templates to project
39
+ #DO NOT MESS WITH THE TEMPLATE HEADERS
40
+ title = input("Enter a name for the VIS project:")
41
+ info = {}
42
+ info[title] = {}
43
+ info[title]["Screens"]={}
44
+ info[title]["defaults"]={}
45
+ info[title]["defaults"]["icon"]="VIS"#default icon
46
+ os.mkdir(wd+"\\.VIS\\project.json")
47
+ with open(wd+"/.VIS/project.json","w") as f:
48
+ json.dump(info,f,indent=4)
49
+ else:
50
+ print(f"VIS project already initialized with path {vp.getPath()}")
51
+
52
+ case "add" | "Add" | "a" | "A":
53
+ match inp[2]:
54
+ case "screen" | "Screen" | "s" | "S":
55
+ screen = inp[3] #File & directory creation for VIS structure
56
+ print("Screens/"+screen+"\t exists") if os.path.exists(wd+"/Screens/"+screen) else os.mkdir(wd+"/Screens/"+screen)
57
+ print("modules/"+screen+"\t exists") if os.path.exists(wd+"/modules/"+screen) else os.mkdir(wd+"/modules/"+screen)
58
+ print(screen+".py\t\t exists") if os.path.exists(wd+screen+".py") else shutil.copyfile(wd+"/.VIS/Templates/screen.txt",wd+"/"+screen+".py")
59
+
60
+ with open(wd+"/.VIS/project.json","r") as f:
61
+ info = json.load(f)
62
+ name = list(info.keys())[0]
63
+ if info[name]["Screens"].get(screen) == None:
64
+ sc_name = input("What is the name of this screen?: ")
65
+ info[name]["Screens"][sc_name] ={}
66
+ info[name]["Screens"][sc_name]["script"] = screen+".py"
67
+ match input("Should this screen have its own .exe?: "):
68
+ case "Yes" | "yes" | "Y" | "y":
69
+ info[name]["Screens"][sc_name]["release"] = "TRUE"
70
+ case _:
71
+ info[name]["Screens"][sc_name]["release"] = "FALSE"
72
+ ictf =input("What is the icon for this screen (or none)?: ")
73
+ if ".ICO" in ictf.upper():
74
+ info[name]["Screens"][sc_name]["icon"] = ictf.strip(".ico")
75
+ with open(wd+"/.VIS/project.json","w") as f:
76
+ json.dump(info,f,indent=4)
77
+ #somewhere in this process we can attempt to replace "Placeholder Title" and the root.iconbitmap
78
+
79
+
80
+ if len(inp) >= 5:
81
+ match inp[4]:
82
+ case "menu" | "Menu" | "m" | "M":
83
+ print("Add screen menu")
84
+ case "elements" | "Elements" | "e" | "E":
85
+ subprocess.call("python " + vl.replace("\\","/")+"/elements.py "+ screen + " " + inp[5])
86
+ else:
87
+ print("Add Screen")
88
+
89
+ case "patch" | "Patch" | "p" | "P":
90
+ subprocess.call("python " + vl.replace("\\","/")+"/patch.py " + inp[2])
91
+
92
+ case "stitch" | "Stitch" | "s" | "S":
93
+ subprocess.call("python " + vl.replace("\\","/")+"/stitch.py "+ inp[2])
94
+
95
+ case "release" | "Release" | "r" | "R":
96
+ subprocess.call("python " + vl.replace("\\","/")+"/release.py " + inp[2])
VIS/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ __version__="0.2.0"
2
+ __author__="Elijah Love"
3
+ __all__ = [
4
+ "menu"
5
+ ]
Binary file
VIS/elements.py ADDED
@@ -0,0 +1,27 @@
1
+ import sys
2
+ import shutil
3
+ import os
4
+ import subprocess
5
+ import project as vp
6
+
7
+ screen = sys.argv[1]
8
+ elements = sys.argv[2]
9
+ elements = elements.split('-')
10
+
11
+ project = vp.getPath()
12
+
13
+ for e in elements:
14
+ if not os.path.exists(project+"/Screens/"+screen+"/f_"+e+".py"):
15
+ shutil.copyfile(project+"/.VIS/Templates/f_element.txt",project+"/Screens/"+screen+"/f_"+e+".py")
16
+ print("element\tf_"+e+".py\tcreated in\tScreens/"+screen+"/")
17
+ subprocess.call("VIS patch "+project+"/Screens/"+screen+"/"+e+".py")
18
+
19
+ if not os.path.exists(project+"/modules/"+screen+"/m_"+e+".py"):
20
+ with open(project+"/modules/"+screen+"/m_"+e+".py", "w"): pass
21
+ print("module\tm_"+e+".py\tcreated in\tScreens/"+screen+"/")
22
+
23
+ if not os.path.exists(project+"/"+screen+".py"):#cannot create elements without screen so will create screen if it doesnt exist
24
+ shutil.copyfile(project+"/.VIS/Templates/screen.txt"+project+"/"+screen+".py")
25
+ print("screen\t"+e+".py \tcreated in\troot")
26
+
27
+ subprocess.call("VIS stitch "+screen)
VIS/menu.py ADDED
@@ -0,0 +1,66 @@
1
+ import json
2
+ from tkinter import *
3
+ from tkinter import ttk
4
+ import subprocess
5
+ import sys
6
+ import os
7
+
8
+ if str.upper(sys.platform)=="WIN32":
9
+ cfp = 'win'
10
+ else:
11
+ cfp = 'rasp'
12
+
13
+ class Item(Menu):
14
+ """Each item in the menu is created from the corresponding .json file. Each path should be given relative to xyz/WOM/
15
+ """
16
+ def __init__(self,root,_root,path,nav,*args,**kwargs):
17
+ self.button = ttk.Button(root, *args, **kwargs)
18
+ self.root = root
19
+ self.path = path
20
+ self._root = _root
21
+ self.nav = nav
22
+ self.button.config(command = self.itemPath)
23
+ #self.button.pack()
24
+
25
+ def itemPath(self):
26
+ self.root.destroy()
27
+ if ".exe" in self.path:
28
+ os.startfile(self.path)
29
+ else:
30
+ subprocess.call("pythonw.exe "+self.path)
31
+ self._root.destroy()
32
+
33
+
34
+
35
+ class Menu:
36
+ """The menu class drawings a column of buttons with subprocess calls to paths defined in a corresponding .json file.
37
+
38
+ Has two roots because can destory both main window and subwindow on redirect.
39
+ """
40
+ def __init__(self, root, _root, path):
41
+ root.focus_force()#use to force window into focus
42
+ self.path = path
43
+ self.n_dict = {}
44
+ with open(path) as file:
45
+ self.dict = json.load(file)
46
+
47
+
48
+ for item in self.dict:
49
+
50
+ ob = Item(root,_root,
51
+ path= self.dict[item]["path"],
52
+ nav = self.dict[item]["nav"],
53
+ text = self.dict[item]["text"]
54
+ )
55
+ ob.button.pack()
56
+ self.n_dict[ob.nav]=ob
57
+
58
+ root.bind("<KeyPress>",self.menuNav)
59
+
60
+ def menuNav(self,happ):
61
+ k=happ.char
62
+ if self.n_dict.get(k) != None:
63
+ self.n_dict[k].itemPath()
64
+
65
+
66
+
VIS/patch.py ADDED
@@ -0,0 +1,11 @@
1
+ import sys
2
+
3
+ file = sys.argv[1]
4
+ frame = file.split('/')[-1][:-3]
5
+ file=file.replace(frame,"f_"+frame)
6
+ with open(file,"r") as f:
7
+ text = f.read()
8
+ text = text.replace("<frame>","f_"+frame)
9
+ with open(file,"w") as f:
10
+ f.write(text)
11
+ print("patched\tf_"+frame+".py")
VIS/project.py ADDED
@@ -0,0 +1,16 @@
1
+ import os
2
+ def getPath():
3
+ """Searches for .VIS folder and returns from path.cfg
4
+ """
5
+ sto = 0
6
+ while True:
7
+ try:
8
+ step=""
9
+ for i in range(0,sto,1): #iterate on sto to step backwards and search for project info
10
+ step = "../" + step
11
+ if os.path.exists(step+".VIS/"):
12
+ return open(step+".VIS/path.cfg","r").read().replace("\\","/") #return stored path
13
+ else:
14
+ sto += 1
15
+ except:
16
+ return None #if failed return none
VIS/release.py ADDED
@@ -0,0 +1,107 @@
1
+ import sys
2
+ from project import *
3
+ import subprocess
4
+ import json
5
+ import shutil
6
+ from os.path import exists
7
+
8
+ root = getPath()
9
+ info = {}
10
+ with open(root+"/.VIS/project.json","r") as f:
11
+ info = json.load(f)
12
+ name = list(info.keys())[0]
13
+
14
+ def build(version:str=""):
15
+ """Build project spec file with specific version
16
+ """
17
+
18
+ print(f"Creating project.spec for {name}")
19
+
20
+ with open(root+"/.VIS/Templates/spec.txt","r") as f:
21
+ spec = f.read()
22
+ with open(root+"/.VIS/Templates/collect.txt","r") as f:
23
+ collect = f.read()
24
+
25
+ spec_list = []
26
+ name_list = []
27
+
28
+ for i in info[name]["Screens"].keys():
29
+ if info[name]["Screens"][i]["release"] == "TRUE":
30
+ name_list.append(i)
31
+ file = info[name]["Screens"][i]["script"]
32
+ #icon = "du"
33
+ if not info[name]["Screens"][i].get("icon") == None:
34
+ icon = info[name]["Screens"][i]["icon"]
35
+ else:
36
+ icon = info[name]["defaults"]["icon"]
37
+ spec_list.append(spec.replace("$name$",i))
38
+ spec_list[len(spec_list)-1] = spec_list[len(spec_list)-1].replace("$icon$",icon)
39
+ spec_list[len(spec_list)-1] = spec_list[len(spec_list)-1].replace("$file$",file)
40
+ spec_list.append("\n\n")
41
+
42
+ insert = ""
43
+ for i in name_list:
44
+ insert=insert+"\n\t"+i+"_exe,\n\t"+i+"_a.binaries,\n\t"+i+"_a.zipfiles,\n\t"+i+"_a.datas,"
45
+ collect = collect.replace("$insert$",insert)
46
+ collect = collect.replace("$version$",name+"-"+version) if not version == "" else collect.replace("$version$",name)
47
+
48
+ header = "# -*- mode: python ; coding: utf-8 -*-\n\n\n"
49
+
50
+ with open(root+"/.VIS/project.spec","w") as f:
51
+ f.write(header)
52
+ with open(root+"/.VIS/project.spec","a") as f:
53
+ f.writelines(spec_list)
54
+ f.write(collect)
55
+
56
+ print(f"Setup project.spec for {name} {version if not version =="" else "current"}")#advanced version will improve this
57
+
58
+ def clean(version:str=" "):
59
+ """Cleans up build environment to save space
60
+ """
61
+ print("Cleaning up build environment")
62
+ if version == "":
63
+ if exists(f"{root}/dist/{name}/Icons/"): shutil.rmtree(f"{root}/dist/{name}/Icons/")
64
+ if exists(f"{root}/dist/{name}/Images/"): shutil.rmtree(f"{root}/dist/{name}/Images/")
65
+ shutil.copytree(root+"/Icons/",f"{root}/dist/{name}/Icons/",dirs_exist_ok=True)
66
+ shutil.copytree(root+"/Images/",f"{root}/dist/{name}/Images/",dirs_exist_ok=True)
67
+ else:
68
+ if exists(f"{root}/dist/{name}/Icons/"): shutil.rmtree(f"{root}/dist/{name}/Icons/")
69
+ if exists(f"{root}/dist/{name}/Images/"): shutil.rmtree(f"{root}/dist/{name}/Images/")
70
+ shutil.copytree(root+"/Icons/",f"{root}/dist/{name}-{version.strip(" ")}/Icons/",dirs_exist_ok=True)
71
+ shutil.copytree(root+"/Images/",f"{root}/dist/{name}-{version.strip(" ")}/Images/",dirs_exist_ok=True)
72
+ print(f"\n\nReleased new{version}build of {name}!")
73
+
74
+ version = sys.argv[1]
75
+ match version:
76
+ case "a":
77
+ build("alpha")
78
+ subprocess.call(f"pyinstaller {root}/.VIS/project.spec --noconfirm --distpath {root}/dist/ --log-level FATAL")
79
+ clean(" alpha ")
80
+ case "b":
81
+ build("beta")
82
+ subprocess.call(f"pyinstaller {root}/.VIS/project.spec --noconfirm --distpath {root}/dist/ --log-level FATAL")
83
+ clean(" beta ")
84
+ case "c":
85
+ build()
86
+ subprocess.call(f"pyinstaller {root}/.VIS/project.spec --noconfirm --distpath {root}/dist/ --log-level FATAL")
87
+ clean()
88
+ case "sync":
89
+ build("alpha")
90
+ subprocess.call(f"pyinstaller {root}/.VIS/project.spec --noconfirm --distpath {root}/dist/ --log-level FATAL")
91
+ clean(" alpha ")
92
+ build("beta")
93
+ subprocess.call(f"pyinstaller {root}/.VIS/project.spec --noconfirm --distpath {root}/dist/ --log-level FATAL")
94
+ clean(" beta ")
95
+ build()
96
+ subprocess.call(f"pyinstaller {root}/.VIS/project.spec --noconfirm --distpath {root}/dist/ --log-level FATAL")
97
+ clean()
98
+ print("\t- alpha\n\t- beta\n\t- current")
99
+ case _:
100
+ inp = input(f"Release Project Version {version}?")
101
+ match inp:
102
+ case "y" | "Y" | "yes" | "Yes":
103
+ build(version)
104
+ subprocess.call(f"pyinstaller {root}/.VIS/project.spec --noconfirm --distpath {root}/dist/ --log-level FATAL")
105
+ clean(f" {version} ")
106
+ case _:
107
+ print(f"Could not release Project Version {version}")
VIS/screen.py ADDED
@@ -0,0 +1,15 @@
1
+ import sys
2
+ file = sys.argv[1]
3
+ frame = file.split('\\')[-1][:-3]
4
+ dump_screens = False
5
+ dump_modules = False
6
+ with open(file,"r") as f:
7
+ text= f.readlines()
8
+ for line in text:
9
+ if "screen elements" in line.lower():
10
+ dump_screens=True
11
+ elif "screen elements" in line.lower():
12
+ dump_modules=True
13
+
14
+ with open(file,"w") as f:
15
+ f.write(text)
VIS/stitch.py ADDED
@@ -0,0 +1,37 @@
1
+ import sys
2
+ import re
3
+ import glob
4
+ import project as vp
5
+
6
+ project = vp.getPath()
7
+ screen = sys.argv[1]
8
+ with open(project+"/"+screen+".py","r") as f:
9
+ text = f.read()
10
+
11
+ #Elements
12
+ pattern = r"#Screen Elements.*#Screen Grid"
13
+ replacement = glob.glob(project+"/Screens/"+screen+'/f_*')
14
+ for i in range(0,len(replacement),1):
15
+ replacement[i] = replacement[i].replace("\\","/")
16
+ replacement[i] = replacement[i].replace(project+"/Screens/"+screen+"/","Screens."+screen+".")[:-3]
17
+ #print(replacement)
18
+ replacement = "from " + " import *\nfrom ".join(replacement) + " import *\n"
19
+ #print(replacement)
20
+ text = re.sub(pattern, "#Screen Elements\n" + replacement + "\n#Screen Grid", text, flags=re.DOTALL)
21
+
22
+ #Modules
23
+ pattern = r"#Screen Modules.*#Handle Arguments"
24
+ replacement = glob.glob(project+"/modules/"+screen+'/m_*')
25
+ for i in range(0,len(replacement),1):
26
+ replacement[i] = replacement[i].replace("\\","/")
27
+ print("stitching\t"+replacement[i].strip(project)+"\tto\t"+screen+".py")
28
+ replacement[i] = replacement[i].replace(project+"/modules/"+screen+"/","modules."+screen+".")[:-3]
29
+ #print(replacement)
30
+ replacement = "from " + " import *\nfrom ".join(replacement) + " import *\n"
31
+ #print(replacement)
32
+ text = re.sub(pattern, "#Screen Modules\n" + replacement + "\n#Handle Arguments", text, flags=re.DOTALL)
33
+ #print(text)
34
+
35
+ with open(project+"/"+screen+".py","w") as f:
36
+ f.write(text)
37
+ print("stitched\t"+screen+".py\twith\tall")
@@ -0,0 +1,50 @@
1
+ Metadata-Version: 2.4
2
+ Name: VIStk
3
+ Version: 0.3.6
4
+ Summary: Visual Interfacing Structure for python using tkinter
5
+ Author-email: Elijah Love <elijah2005l@gmail.com>
6
+ Maintainer-email: Elijah Love <elijah2005l@gmail.com>
7
+ License: BSD 2-Clause License
8
+
9
+ Copyright (c) 2025, Elijah Love
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright notice, this
15
+ list of conditions and the following disclaimer.
16
+
17
+ 2. Redistributions in binary form must reproduce the above copyright notice,
18
+ this list of conditions and the following disclaimer in the documentation
19
+ and/or other materials provided with the distribution.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+
32
+ Project-URL: Homepage, https://github.com/KarlTheKrazyKat/VIS/blob/master/README.md
33
+ Project-URL: Documentation, https://github.com/KarlTheKrazyKat/VIS/blob/master/documentation.md
34
+ Project-URL: Repository, https://github.com/KarlTheKrazyKat/VIS/
35
+ Project-URL: Bug Tracker, https://github.com/KarlTheKrazyKat/VIS/blob/master/knownissues.md
36
+ Project-URL: Changelog, https://github.com/KarlTheKrazyKat/VIS/blob/master/changelog.md
37
+ Keywords: python,gui
38
+ Classifier: Development Status :: 4 - Beta
39
+ Classifier: Programming Language :: Python
40
+ Requires-Python: >=3.13
41
+ Description-Content-Type: text/markdown
42
+ License-File: LICENSE
43
+ Requires-Dist: tk
44
+ Dynamic: license-file
45
+
46
+ # Welcome to my Visual Interfacing Structure (VIS)
47
+
48
+ A simple to use framework to build GUIs for python apps
49
+
50
+ Enjoy!
@@ -0,0 +1,21 @@
1
+ VIS/Form.zip,sha256=Uu6GK-n26kOSxSzL7HWHcqZf6p3bCn7tHCZ2F1YWnxk,25866
2
+ VIS/VIS.py,sha256=4ZpMLbYSlvHpiQvWptY-pb4kH3tflbNfu4wumbJXQWM,4885
3
+ VIS/__init__.py,sha256=gO-ri9N9K-CQ3wJi-CX12MYhbrdqz2fvhJU-ZGf5BjI,69
4
+ VIS/elements.py,sha256=cq5__ICkdiKVF981o5AbetbmD3lB3HgMp0nsfZ6vKIo,1041
5
+ VIS/menu.py,sha256=PqPYzsFfGpVeej85v59wbeWeSy24I-m0bFUAxtRBiSQ,1815
6
+ VIS/patch.py,sha256=xvXXSF1cWH1aQhYauHkHulAyoj-RB85pJgSaPvGkglM,268
7
+ VIS/project.py,sha256=kWkNzCSIdc6Ij0vnGVGugSjbWs0EFCkPmDtCF8w5850,536
8
+ VIS/release.py,sha256=grA6M5hVbZDdJyi3bUXcwYzcye21yiNThThsjRgzTuY,4478
9
+ VIS/screen.py,sha256=am3pRnfXoC2G1TSVA_FyAuOKQ_PuVCKQMQCwkwSWe_s,377
10
+ VIS/stitch.py,sha256=AT9y9bDAJp-wmfUCWeUCp3mn_b8u9yEL5DE5XOn32Sc,1428
11
+ VIS/Templates/collect.txt,sha256=ZU5m4g2VBOWNWAGMUjZoi2UIc2uWmlV-L7_IXc3lBVU,96
12
+ VIS/Templates/f_element.txt,sha256=MVovajsLC2O5t_ZSOb9NppGqzziGqISWSaEJ7kbrl7U,485
13
+ VIS/Templates/screen.txt,sha256=4k732aBbT_tf3fwcsM1RLB8UPFNA03EWBRo1aw0jw8U,803
14
+ VIS/Templates/spec.txt,sha256=_IlwxuNxmtFOriZ6JWgtPANLkA8GFzOm80lE9PhqKfs,690
15
+ VIS/__pycache__/__init__.cpython-313.pyc,sha256=G_EdBuWyhjGJ4zI9Sc81loMtV0ANdEzC6JmUwcnaomI,218
16
+ vistk-0.3.6.dist-info/licenses/LICENSE,sha256=FxXH04vmzWaQWNEoGwgDcLEG8Li5qf36NNz3UyrBMvQ,1300
17
+ vistk-0.3.6.dist-info/METADATA,sha256=dUjKSYpAIYq7nrYOFYdsZ8SNNJMtXkRqrTRREg9SLoc,2493
18
+ vistk-0.3.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ vistk-0.3.6.dist-info/entry_points.txt,sha256=Fq_VLNEc6Rk4-S8ICPkPjNozFeDeeeFAF5lvK7hQu7o,41
20
+ vistk-0.3.6.dist-info/top_level.txt,sha256=iFRNav6cokh9J-6nat5rgNWLdQm371xQ3OPb9w7i5mI,4
21
+ vistk-0.3.6.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ VIS = VIS.VIS:__main__
@@ -0,0 +1,24 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2025, Elijah Love
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1 @@
1
+ VIS