Diskuze: Programovací prostředí


Postoupil sem k oknové aplikaci ale pořád je to uživatelsky nepřívětivé a pořád nevím jak na podmínku
from PyQt5 import QtWidgets, QtGui
import sys
program = "program.txt"
class Window(QtWidgets.QMainWindow):
def __init__(self, **kwargs):
super(Window, self).__init__(**kwargs)
self.setWindowTitle("Programovaci prostredi")
self.init_gui()
self.show()
def init_gui(self):
formular = QtWidgets.QWidget()
formularLayout = QtWidgets.QVBoxLayout()
formular.setLayout(formularLayout)
boxLayout1 = QtWidgets.QHBoxLayout()
boxLayout2 = QtWidgets.QHBoxLayout()
formularLayout.addStretch()
formularLayout.addLayout(boxLayout1)
formularLayout.addLayout(boxLayout2)
formularLayout.addStretch()
def init_gui(self):
formular = QtWidgets.QWidget()
formularLayout = QtWidgets.QVBoxLayout()
formular.setLayout(formularLayout)
boxLayout1 = QtWidgets.QHBoxLayout()
boxLayout2 = QtWidgets.QHBoxLayout()
formularLayout.addStretch()
formularLayout.addLayout(boxLayout1)
formularLayout.addLayout(boxLayout2)
formularLayout.addStretch()
self.stopButton = QtWidgets.QPushButton("STOP", self)
boxLayout2.addWidget(self.stopButton)
self.vpredButton = QtWidgets.QPushButton("VPRED", self)
boxLayout2.addWidget(self.vpredButton)
self.vzadButton = QtWidgets.QPushButton("VZAD", self)
boxLayout2.addWidget(self.vzadButton)
self.levaButton = QtWidgets.QPushButton("VLEVO", self)
boxLayout2.addWidget(self.levaButton)
self.pravaButton = QtWidgets.QPushButton("VPRAVO", self)
boxLayout2.addWidget(self.pravaButton)
self.deleButton = QtWidgets.QPushButton("SMAZAT", self)
boxLayout1.addWidget(self.deleButton)
self.setCentralWidget(formular)
self.stopButton.clicked.connect(self.stop)
self.vpredButton.clicked.connect(self.vpred)
self.vzadButton.clicked.connect(self.vzad)
self.levaButton.clicked.connect(self.leva)
self.pravaButton.clicked.connect(self.prava)
self.deleButton.clicked.connect(self.dele)
def stop(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Zastav\n")
f.flush()
print("Zapsano STOP")
def vpred(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Jed vpred\n")
f.flush()
print("Zapsano VPRED")
def vzad(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Jed vzad\n")
f.flush()
print("Zapsano VZAD")
def leva(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Otocit vlevo\n")
f.flush()
print("Zapsano DOLEVA")
def prava(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Otocit vpravo\n")
f.flush()
print("Zapsano DOPRAVA")
def dele(self):
with open(program, "w", encoding="utf-8") as f:
f.write()
f.flush()
aplikace = QtWidgets.QApplication(sys.argv)
okno = Window()
sys.exit(aplikace.exec_())
Vložení podmínky asi vyřešeno, ale pořád to není uživatelsky OK
from PyQt5 import QtWidgets, QtGui
import sys
program = "program.txt"
class Window(QtWidgets.QMainWindow):
def __init__(self, **kwargs):
super(Window, self).__init__(**kwargs)
self.setWindowTitle("Programovaci prostredi")
self.init_gui()
self.show()
def init_gui(self):
formular = QtWidgets.QWidget()
formularLayout = QtWidgets.QVBoxLayout()
formular.setLayout(formularLayout)
boxLayout1 = QtWidgets.QHBoxLayout()
boxLayout2 = QtWidgets.QHBoxLayout()
formularLayout.addStretch()
formularLayout.addLayout(boxLayout1)
formularLayout.addLayout(boxLayout2)
formularLayout.addStretch()
self.operatorComboBox = QtWidgets.QComboBox(self)
self.operatorComboBox.addItem("<")
self.operatorComboBox.addItem(">")
self.operatorComboBox.addItem("==")
self.operatorComboBox2 = QtWidgets.QComboBox(self)
self.operatorComboBox2.addItem("I1")
self.operatorComboBox2.addItem("I2")
self.operatorComboBox2.addItem("I3")
self.operatorComboBox2.addItem("I4")
self.operatorComboBox2.addItem("I5")
self.operatorComboBox2.addItem("I6")
self.operatorComboBox2.addItem("Pocet kroku")
self.vstup = QtWidgets.QLineEdit(self)
self.podButton = QtWidgets.QPushButton("PODMÍNKA", self)
self.kpodButton = QtWidgets.QPushButton("KONEC PODMÍNKY", self)
self.stopButton = QtWidgets.QPushButton("STOP", self)
self.vpredButton = QtWidgets.QPushButton("VPRED", self)
self.vzadButton = QtWidgets.QPushButton("VZAD", self)
self.levaButton = QtWidgets.QPushButton("VLEVO", self)
self.pravaButton = QtWidgets.QPushButton("VPRAVO", self)
self.deleButton = QtWidgets.QPushButton("SMAZAT", self)
self.setCentralWidget(formular)
#Serazeni
boxLayout1.addWidget(self.operatorComboBox2)
boxLayout1.addWidget(self.operatorComboBox)
boxLayout1.addWidget(self.vstup)
boxLayout2.addWidget(self.podButton)
boxLayout2.addWidget(self.kpodButton)
boxLayout2.addWidget(self.stopButton)
boxLayout2.addWidget(self.vpredButton)
boxLayout2.addWidget(self.vzadButton)
boxLayout2.addWidget(self.levaButton)
boxLayout2.addWidget(self.pravaButton)
boxLayout2.addWidget(self.deleButton)
#Napojeni tlacitek
self.stopButton.clicked.connect(self.stop)
self.vpredButton.clicked.connect(self.vpred)
self.vzadButton.clicked.connect(self.vzad)
self.levaButton.clicked.connect(self.leva)
self.pravaButton.clicked.connect(self.prava)
self.deleButton.clicked.connect(self.dele)
self.podButton.clicked.connect(self.pod)
self.kpodButton.clicked.connect(self.kpod)
#Definice funkci tlacitek
def stop(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Zastav\n")
f.flush()
print("Zapsano STOP")
def vpred(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Jed vpred\n")
f.flush()
print("Zapsano VPRED")
def vzad(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Jed vzad\n")
f.flush()
print("Zapsano VZAD")
def leva(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Otocit vlevo\n")
f.flush()
print("Zapsano DOLEVA")
def prava(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Otocit vpravo\n")
f.flush()
print("Zapsano DOPRAVA")
def pod(self):
operator = self.operatorComboBox.currentText()
operator2 = self.operatorComboBox2.currentText()
vstup = str(self.vstup.text())
with open(program, "a", encoding="utf-8") as f:
f.write("Podmínka\n")
f.write(operator2 + operator + vstup +"\n")
f.flush()
print("Zapsano Podminka\n" + operator2 + operator + vstup)
def kpod(self):
with open(program, "a", encoding="utf-8") as f:
f.write("Konec podminky\n")
f.flush()
print("Zapsano Konec podminky")
def dele(self):
with open(program, "w", encoding="utf-8") as f:
f.write()
f.flush()
aplikace = QtWidgets.QApplication(sys.argv)
okno = Window()
sys.exit(aplikace.exec_())
Ladislav Tlapák:2.1.2021 17:37
Další pokus o grafické prostředí
import tkinter as tk
from tkinter import ttk
from tkinter import *
LARGE_MAIN_FONT= ("Courier", 40, "bold")
LARGE_FONT= ("Courier", 40)
BUTTON_FONT= ("Arial", 20, "bold")
class SeaofBTCapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
self.geometry("500x500")
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
self.winfo_toplevel().title("Yuki Robotics")
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Main menu", font=LARGE_MAIN_FONT)
label.pack(pady=10,padx=10)
button = tk.Button(self, text="Motion", font=BUTTON_FONT,
command=lambda: controller.show_frame(PageOne))
button.pack()
button2 = tk.Button(self, text="Programing", font=BUTTON_FONT,
command=lambda: controller.show_frame(PageTwo))
button2.pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Motion", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = tk.Button(self, text="Back to main menu", font=BUTTON_FONT,
command=lambda: controller.show_frame(StartPage))
button1.pack()
def print_valuea(vara):
print("a="+vara)
def print_valueb(varb):
print("b="+varb)
def print_valuec(varc):
print("c="+varc)
def print_valued(vard):
print("d="+vard)
def print_valuee(vare):
print("e="+vare)
def print_valuef(varf):
print("f="+varf)
vara = DoubleVar()
varb = DoubleVar()
varc = DoubleVar()
vard = DoubleVar()
vare = DoubleVar()
varf = DoubleVar()
a = Scale(self, variable = vara, orient=HORIZONTAL, length=275, to=275, command=print_valuea, background='orange')
a.pack()
b = Scale(self, variable = varb, orient=HORIZONTAL, length=275, to=275, command=print_valueb, background='red')
b.pack()
c = Scale(self, variable = varc, orient=HORIZONTAL, length=275, to=275, command=print_valuec, background='blue')
c.pack()
d = Scale(self, variable = vard, orient=HORIZONTAL, length=275, to=275, command=print_valued, background='yellow')
d.pack()
e = Scale(self, variable = vare, orient=HORIZONTAL, length=275, to=275, command=print_valuee, background='green')
e.pack()
f = Scale(self, variable = varf, orient=HORIZONTAL, length=275, to=275, command=print_valuef, background='white')
f.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Programing", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = tk.Button(self, text="Back to main menu", font=BUTTON_FONT,
command=lambda: controller.show_frame(StartPage))
button1.pack()
def save():
vara1=str(vara.get())
print("a=" + vara1)
varb1=str(varb.get())
print("b=" + varb1)
varc1=str(varc.get())
print("c=" + varc1)
vard1=str(vard.get())
print("d=" + vard1)
vare1=str(vare.get())
print("e=" + vare1)
varf1=str(varf.get())
print("f=" + varf1)
vara = DoubleVar()
varb = DoubleVar()
varc = DoubleVar()
vard = DoubleVar()
vare = DoubleVar()
varf = DoubleVar()
a = Scale(self, variable = vara, orient=HORIZONTAL, length=275, to=275, background='orange')
a.pack()
b = Scale(self, variable = varb, orient=HORIZONTAL, length=275, to=275, background='red')
b.pack()
c = Scale(self, variable = varc, orient=HORIZONTAL, length=275, to=275, background='blue')
c.pack()
d = Scale(self, variable = vard, orient=HORIZONTAL, length=275, to=275, background='yellow')
d.pack()
e = Scale(self, variable = vare, orient=HORIZONTAL, length=275, to=275, background='green')
e.pack()
f = Scale(self, variable = varf, orient=HORIZONTAL, length=275, to=275, background='white')
f.pack()
button2 = tk.Button(self, text="Save", font=BUTTON_FONT,
command=save)
button2.pack()
app = SeaofBTCapp()
app.mainloop()
hele a napadlo tě někdy že třeba v jiným programovacím jazyku je
uživatelský prostředí už hotový a měl bys to jednodušší ???
co třeba C# a knihovna WinForms nebo jeji novější verze s názvem WPF ???
obojí už funguje jak pro .NET 4.7.2 tak i nejnovější .NET5/6 protože .NET
core je mrtvá technologie ..
ale jestli trváš na úchylárnách doporučuju MS VS 2019 C++/CX UWP/UWA ...
je tam skvělej visuální návrhář
něco ve smyslu WPF
Ladislav Tlapák:18.4.2021 12:52
Zatím sem od projektu upustil kvůli tomuto problému. Jelikož nevím pořádně jak na to
Ladislav Tlapák:19.4.2021 2:05
Neselhal sem ani tak na grafice, jak na to aby si uživatel mohl nakonfigurovat libovolný počet kroků do programu a ten někam uložit načíst jiný atd. Na jazyku prostředí mi nesejde jelikož výstup s ovládacího kódu čtu ze souboru. Ovladači sw v jednom řádku dával kde je, v druhém kam má jet a ze třetího četl povel kam má jet. Šel sem postupně a splacaval kódy které fungovaly.
k těmto účelům slouží v C# projekt Roslyn což je kompilátor ... python ho má také.... a C# má k tomuto účelu vývojové prostředí např. SharpDevelop nebo VisualStudioCode a obojí je ve formě "portable" což je důležité ... Python určitě také něco takového má...
DarkCoder:19.4.2021 11:33
Vytvoření hloupého chování robota, který dělá pouze to a to, je prosté. Způsob ovládání může být obdobný jako fungují aplikace ve Windows, kde se proceduře okna předávají zprávy, které se následně dle typu zprávy zpracovávají a kde přístup k informacím je uchováván prostřednictvím parametrů.
Takový robot může být řízen následujícími zprávami:
E - zapnutí/vypnutí motorů (1 - zapnutí, 0 vypnutí)
F - vpřed (N - počet kroků)
B - vzad (N - počet kroků)
L - vlevo (N - počet kroků)
P - vpravo (N - počet kroků)
S - stop (N - počet sekund)
Pak lze generovat například následující chování
E1
R2
F2
S5
L1
F1
R2
F2
B1
R1
F2
S1
E0
Tedy robot zapne motory, otočí se po pravé ruce, posune se o 2 kroky vpřed, zastaví se na 5 sekund, otočí se doleva, popojede vpřed, otočí se po pravé ruce, popojede o 2 kroky vpřed, popojede pozpátku o 1 krok, otočí se doprava, popojede vpřed 2 kroky, zastaví se na 1 sekundu a nakonec vypne motory.
Robot opíše trasu písmene 'T'.
A jak takové prostředí vytvořit? Ideálně grafické prostředí, designově jako obrazovka ve hře hledání min, kde řádky představují následující úkon a sloupec událost která má nastat. Po pravé straně textbox do kterého uživatel zadá doplňkovou hodnotu. Na výsledek naklikání chování robota vytvoříš kompilátor na sebe navazujících událostí (robot se nemůže pohybovat vpřed když mu neběží motory, apod.), po validaci uložíš data do souboru, který může vypadat jako výše v příkladu.
Můžeš např. vytvořit časovou osu do které přeneseš události. Inspiraci si můžeš vzít třeba z aplikací na výuku hraní na piana.
Možností je spousty a je jen na tobě a tvé fantasii jak bude vytvoření chování robota vypadat.
Ladislav Tlapák:19.4.2021 11:41
Více méně podobně jsem na to šel na jednom řádku mám 6 čísle které určují kroky pro každou osu jen asi nejsem zatím tak zdatný abych udělal nějak aby si to uživatel “naprogramoval sám”
DarkCoder:19.4.2021 12:31
S trochou nadsázky z mnou uvedeného příkladu a způsobu implementace
popisu chování robota by mi postačil textový editor. Vizuální podoba
zápisu, přirovnám-li to k programování, je blízká strojovému kódu, což
není z uživatelského hlediska ideální. Na takto malém množství úkonů a
nastaveních to však lze ještě mít pod kontrolou. Co už ale není pod
kontrolou je to, co se v kterém okamžiku děje. To lze vyřešit aplikací s
grafickým výstupem. Dále je třeba určit, zda úkony budou prováděny
synchronně nebo asynchronně, tedy jestli může nastat situace, že dva úkony
mohou probíhat současně nebo každý úkon po provedení předchozího. To
ovlivňuje způsob návrhu prostředí aplikace. Pak už stačí vše
zrealizovat
DarkCoder:19.4.2021 12:36
Určitou podobu můžeš vidět u šachových programů, kde je vidět co se dělo v kterém tahu.
Ladislav Tlapák:19.4.2021 13:49
Mno nastavené v ovládání to mám takto. Každé servo muže jet od 0 do 180 a když mu dojde požadavek tak všechny serva kterých se to týká jedou současně + nebo - 1 a je tam pak proměnná delay kterou ovládám rychlost pohybu
DarkCoder:19.4.2021 15:40
Je třeba odlišovat interní a externí záležitosti. Uživatele např. zajímá akorát to, že robot se bude pohybovat vpřed po dobu tolik a tolik a takovou rychlostí nebo že absolvuje tolik kroků. Pořád jsou to vztahy závislostí dráhy, času, rychlosti. To že jede vpřed, tak ho vůbec nemusí zajímat že servo pro otáčení či zpětný chod je vypnuté. To už je záležitostí interní. Opět záleží na implementaci, zda robot pracuje jako stavový automat nebo v reálném čase nebo je ovládán událostmi na sebe navazující. Vše postupně. Dostaneš-li zprávu R1, což je prosté otočení doprava o 90°, stanov rychlost otáčení interně. Budeš-li chtít víc možností, pak budeš muset buď předávat více hodnot k události, nebo přijímat více zpráv. Ať už bude možností málo nebo hodně, to hlavní je funkčnost, spolehlivost a uživatelská přívětivost.
Ladislav Tlapák:19.4.2021 18:12
Zatím neřeším ani stupeň nýbrž pouze kroky motoru. Porad sem se nedostal přes to prostředí
DarkCoder:19.4.2021 18:53
Popsal jsem Ti zde spoustu možností, jak to vyřešit. Stačí si jen vybrat..
Ladislav Tlapák:19.4.2021 19:11
Ano za to děkuji nějak poberu ty informace a dam vědět o pokroku
Bohuslav Kolman:26.4.2021 12:49
Zkusím ti popsat pár postřehů z praxe:
- jako programátor řeším jak se mi pohybuje ta součást, která je upnutá v griperu. Do jakého bodu se má dostat, jestli se pohne po přímce nebo oblouku, jakou rychlostí. V podstatě je mi jedno o kolik se otočí každý motor robota.
- rychlost - tady stačí regulace typu 10% - 25% - 50% - 100%. 100% je definované konstrukcí robota a rychlostí jeho pohonů.
- robot má nějakou základní pozici "home position" z které vychází všechny aktivity robota a kam se vrací po ukončení dané akce. Je to takový referenční bod.
- robotické pracoviště a robot jsou navzájem orientované pomocí souřadného systému. Základní nulový bod (X=0, Y=0, Z=0) se často pokládá do středu podstavy robota. Další nulové body se k němu vztahují - např. nulový bod konce ramena robota, nulový bod griperu, nulový bod nakládacího a odebíracího místa součásti ...
- při programování robota se často postupuje tak, že si najedu robotem do požadovaného bodu dráhy a bod si uložím (tlačítko "Převzít bod").
- např. pro zvedání součásti je vhodné mít možnost definovat pohyb inkrementálně (např.: X +25 mm). Přitom tohle X nemusí mít stejný směr jako je v základním souřadném systému. Z toho důvodu se používá sada nulových bodů, jak jsem zmínil výše.
- pro odladění a kontrolu dráhy robota je potřeba spouštět program po krocích a v případě problému mít možnost upravit aktuální řádek programu způsobem, že si ručně popojedu kousek stranou a přepíšu/převezmu novou hodnotu.
Další rozsáhlá kapitola je samotná stavba programu a komunikace s okolními zařízeními.
Ještě bych ti doporučil se přihlásit na kurz základy ovládání robota, které pořádá třeba ABB. Dozvíš se tam principy jak robot funguje, jak se ovládá a jak se na programování robota dívá uživatel/programátor.
Pro inspiraci https://augmentus.tech/
Zobrazeno 19 zpráv z 19.