Új hozzászólás Aktív témák
-
SzVFE1
csendes tag
válasz
kovisoft
#3410
üzenetére
Akkor szerinted ez a terminál vezérlés Python alatt semmilyen módszerrel nem kivitelezhető? Mindenesetre megcsináltam, amit javasoltál, a következő kóddal a következőt dobta ki. Nem tudom, hogy az 1000:1000 koordinátákkal eltaláltam-e a felületet, de nagyméretben az teszi ki a képernyő döntő részét.
from pywinauto.application import Application
app = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)
textEditor = app.val.child_window(control_type="Tab").wrapper_object()
getline = app.val.child_window(auto_id="67104", control_type="Edit").wrapper_object()
top_wnd = app.top_window().wrapper_object()
print (control)
Eredmény:uiawrapper.UIAWrapper - '', DialogProcess finished with exit code 0Ezzel tudunk valamit kezdeni?
-
SzVFE1
csendes tag
válasz
kovisoft
#3407
üzenetére
Igen, ahogy mondod a type_keys van használva. Bevágom akkor alább a teljes fastruktúrát, hogy látni lehessen, hogy mennyire kevés a választék. Az alábbi kóddal simán megy a beleírás és a tab váltás is. A tab control alatti pane contol-okkal szintén. Nem ragaszkodom a pywinauto-hoz, bármilyen módszer tökéletes lenne, amivel parancsokat tudnék küldeni a MobaXterm adott tab-jába és szöveget tudnék kiolvasni belőle.
from pywinauto.application import Applicationapp = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)textEditor = app.val.child_window(control_type="Tab").wrapper_object()textEditor.type_keys("^{TAB 2}")textEditor.type_keys("test",with_spaces = True)Control Identifiers:Dialog - 'val' (L-11, T-11, R3851, B2111)['Dialog', 'val', 'valDialog', 'val0', 'val1', 'Dialog0', 'Dialog1']child_window(title="val", control_type="Window")|| Pane - '' (L0, T131, R3840, B173)| ['Pane', 'Pane0', 'Pane1']| child_window(auto_id="67100", control_type="Pane")| || | Pane - '' (L0, T131, R360, B173)| | ['Pane2']| | child_window(auto_id="67102", control_type="Pane")| | || | | Edit - '' (L6, T143, R354, B167)| | | ['Edit']| | | child_window(auto_id="67104", control_type="Edit")| || | Pane - '' (L364, T131, R3778, B173)| | ['Pane3']| | child_window(auto_id="67108", control_type="Pane")|| Pane - '' (L0, T2070, R3840, B2100)| ['Pane4']| child_window(auto_id="67098", control_type="Pane")|| Pane - '' (L0, T64, R3840, B131)| ['Pane5']| child_window(auto_id="67096", control_type="Pane")|| Pane - '' (L0, T173, R360, B2070)| ['Pane6']| child_window(auto_id="66876", control_type="Pane")| || | Pane - '' (L0, T173, R360, B2070)| | ['Pane7']| | child_window(auto_id="66878", control_type="Pane")| | || | | TabControl - '' (L0, T173, R360, B2070)| | | ['TabControl']| | | child_window(auto_id="132416", control_type="Tab")| | | || | | | Pane - '' (L52, T177, R356, B2066)| | | | ['Pane8']| | | | child_window(auto_id="66884", control_type="Pane")| | | | || | | | | Pane - '' (L52, T177, R356, B2066)| | | | | ['Pane9']| | | | | child_window(auto_id="66886", control_type="Pane")| | | | | || | | | | | TreeView - '' (L52, T177, R356, B2066)| | | | | | ['TreeView']| | | | | | child_window(auto_id="132424", control_type="Tree")| | | | | | || | | | | | | TreeItem - 'User sessions' (L96, T177, R195, B211)| | | | | | | ['User sessionsTreeItem', 'TreeItem', 'User sessions', 'TreeItem0', 'TreeItem1']| | | | | | | child_window(title="User sessions", control_type="TreeItem")| | | | | | || | | | | | | TreeItem - 'val' (L122, T211, R146, B245)| | | | | | | ['val2', 'valTreeItem', 'TreeItem2']| | | | | | | child_window(title="val", control_type="TreeItem")| | | || | | | TabItem - '' (L2, T175, R50, B229)| | | | ['TabItem', 'TabItem0', 'TabItem1']| | | || | | | TabItem - '' (L2, T229, R50, B283)| | | | ['TabItem2']| | | || | | | TabItem - '' (L2, T283, R50, B337)| | | | ['TabItem3']|| Pane - '' (L366, T173, R3840, B2070)| ['Pane10']| child_window(auto_id="67090", control_type="Pane")| || | ListBox - '' (L306, T113, R307, B114)| | ['ListBox']| | child_window(auto_id="67094", control_type="List")| || | Pane - '' (L366, T173, R3840, B2070)| | ['Pane11']| | child_window(auto_id="67092", control_type="Pane")| | || | | Dialog - '' (L366, T173, R3840, B2070)| | | ['Dialog2']| | | || | | | ScrollBar - 'Függőleges' (L3814, T173, R3840, B2070)| | | | ['Függőleges', 'ScrollBar', 'FüggőlegesScrollBar']| | | | child_window(title="Függőleges", auto_id="NonClientVerticalScrollBar", control_type="ScrollBar")| | | | || | | | | Button - 'Egy sorral fel' (L3814, T173, R3840, B199)| | | | | ['Egy sorral felButton', 'Button', 'Egy sorral fel', 'Button0', 'Button1']| | | | | child_window(title="Egy sorral fel", auto_id="UpButton", control_type="Button")| | | | || | | | | Button - 'Egy sorral le' (L3814, T2044, R3840, B2070)| | | | | ['Button2', 'Egy sorral leButton', 'Egy sorral le']| | | | | child_window(title="Egy sorral le", auto_id="DownButton", control_type="Button")|| TitleBar - '' (L24, T-8, R3840, B34)| ['TitleBar']| || | Menu - 'Rendszer' (L0, T0, R22, B22)| | ['Rendszer', 'Menu', 'RendszerMenu', 'Rendszer0', 'Rendszer1', 'Menu0', 'Menu1']| | child_window(title="Rendszer", auto_id="MenuBar", control_type="MenuBar")| | || | | MenuItem - 'Rendszer' (L0, T0, R22, B22)| | | ['RendszerMenuItem', 'MenuItem', 'Rendszer2', 'MenuItem0', 'MenuItem1']| | | child_window(title="Rendszer", control_type="MenuItem")| || | Button - 'Kis méret' (L3627, T11, R3698, B33)| | ['Button3', 'Kis méret', 'Kis méretButton']| | child_window(title="Kis méret", control_type="Button")| || | Button - 'Előző méret' (L3698, T11, R3768, B33)| | ['Előző méretButton', 'Button4', 'Előző méret']| | child_window(title="Előző méret", control_type="Button")| || | Button - 'Bezárás' (L3768, T11, R3851, B33)| | ['BezárásButton', 'Button5', 'Bezárás']| | child_window(title="Bezárás", control_type="Button")|| Menu - 'Alkalmazás' (L0, T23, R2560, B42)| ['AlkalmazásMenu', 'Alkalmazás', 'Menu2']| child_window(title="Alkalmazás", auto_id="MenuBar", control_type="MenuBar")| || | MenuItem - '' (L0, T23, R57, B42)| | ['MenuItem2']| || | MenuItem - '' (L57, T23, R116, B42)| | ['MenuItem3']| || | MenuItem - '' (L115, T23, R153, B42)| | ['MenuItem4']| || | MenuItem - '' (L153, T23, R208, B42)| | ['MenuItem5']| || | MenuItem - '' (L209, T23, R250, B42)| | ['MenuItem6']| || | MenuItem - '' (L249, T23, R298, B42)| | ['MenuItem7']| || | MenuItem - '' (L299, T23, R355, B42)| | ['MenuItem8']| || | MenuItem - '' (L355, T23, R407, B42)| | ['MenuItem9']| || | MenuItem - '' (L407, T23, R445, B42)| | ['MenuItem10'] -
SzVFE1
csendes tag
válasz
kovisoft
#3404
üzenetére
Szöveget beleírni a Tab vagy Pane control kiválasztásával sikeresen tudok, csak a kiolvasás nem akar nekem menni. Edit control-ból 2 szokott lenni, az egyik ráadásul el is szokott tűnni a fa struktúrából valami miatt. Lefut a get_line rájuk hibaüzenet nélkül ha a 0-ás sort adom meg, de nem olvas ki semmit. A from_point-ot hogyan kéne esetemben használni? Nem veszélyes abból a szempontból, hogy a kódnak más gépeken, más felbontással is működnie kell? Arra gondolok, ha mondjuk pl. a felhasználó kisméretűben használja az ablakot a képernyő egy random részén, akkor máshova esnek a koordináták.
-
SzVFE1
csendes tag
Most ki is próbáltam ebben a formában, de ezt is eldobja hibával. Egyébként bármilyen tanácsot szívesen fogadok, a pywinauto-hoz sem ragaszkodom, ha létezik jobb a MobaXterm kontrollálására.
from pywinauto.application import Application
app = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)
app.val.print_control_identifiers()
textEditor = app.val.child_window(control_type="Tab").wrapper_object()
getline = app.val.child_window(auto_id="66952", control_type="Edit").wrapper_object()
print(getline.Edit.get_line(0))print(getline.Edit.get_line(0))
AttributeError: 'EditWrapper' object has no attribute 'Edit' -
-
SzVFE1
csendes tag
válasz
kovisoft
#3396
üzenetére
Annyi a gáz, hogy így is alig találtam meg azt a child window-t, amivel kontrollálni tudom a MobaXterm-et. Végül kiderült, hogy ezek control_type="Tab" és control_type="Pane" tulajdonságokkal szerepelnek. Sajnos a control_type="Pane" -ek sem szűkítik le tab-ra, csak ablakra a célt, ezért elégnek találtam a control_type="Tab" -ot használni. Az ablakba írás működik is vele tökéletesen. A másik ok pedig az volt, hogy a control_type="Tab" -ból szerencsére egyetlen létezik, míg control_type="Pane" -ből több, ezért tovább kellene szűkíteni auto_id alapján, ami folyamatosan változik, egyszer használható, így ez lehetetlen küldetésnek tűnik. Bemásolom ide alább a fa struktúra vonatkozó részét, az alapján esetleg lenne ötlet, hogy hogyan változtassam?
Még egy kérdés, a textEditor az egy objektum, nem egy tetszőleges névvel megadható változó?
| | | child_window(auto_id="132416", control_type="Tab")
| | | |
| | | | Pane - '' (L52, T177, R356, B2066)
| | | | ['Pane8']
| | | | child_window(auto_id="197962", control_type="Pane")
| | | | |
| | | | | Pane - '' (L52, T2013, R356, B2066)
| | | | | ['Pane9']
| | | | | child_window(auto_id="67182", control_type="Pane")
| | | | | |
| | | | | | CheckBox - ' Follow terminal folder' (L78, T2013, R356, B2066)
| | | | | | ['CheckBox', ' Follow terminal folder', ' Follow terminal folderCheckBox']
| | | | | | child_window(title=" Follow terminal folder", auto_id="67184", control_type="CheckBox")
| | | | |
| | | | | Pane - '' (L52, T177, R356, B216)
| | | | | ['Pane10']
| | | | | child_window(auto_id="67180", control_type="Pane")
| | | | |
| | | | | ListBox - '' (L52, T249, R356, B1961)
| | | | | ['ListBox', 'ListBox0', 'ListBox1']
| | | | | child_window(auto_id="132696", control_type="List")
| | | | | |
| | | | | | Header - 'Fejlécellenőrzés' (L52, T249, R356, B274)
| | | | | | ['Fejlécellenőrzés', 'Header', 'FejlécellenőrzésHeader']
| | | | | | child_window(title="Fejlécellenőrzés", auto_id="Header", control_type="Header")
| | | | | | |
| | | | | | | HeaderItem - 'Name' (L52, T249, R536, B274)
| | | | | | | ['NameHeaderItem', 'HeaderItem', 'Name', 'HeaderItem0', 'HeaderItem1']
| | | | | | | child_window(title="Name", auto_id="HeaderItem 0", control_type="HeaderItem")
| | | | | | |
| | | | | | | HeaderItem - 'Size (KB)' (L0, T0, R0, B0)
| | | | | | | ['HeaderItem2', 'Size (KB)', 'Size (KB)HeaderItem']
| | | | | | | child_window(title="Size (KB)", auto_id="HeaderItem 1", control_type="HeaderItem")
| | | | | | |
| | | | | | | HeaderItem - 'Last modified' (L0, T0, R0, B0)
| | | | | | | ['HeaderItem3', 'Last modifiedHeaderItem', 'Last modified']
| | | | | | | child_window(title="Last modified", auto_id="HeaderItem 2", control_type="HeaderItem")
| | | | | | |
| | | | | | | HeaderItem - 'Owner' (L0, T0, R0, B0)
| | | | | | | ['HeaderItem4', 'OwnerHeaderItem', 'Owner']
| | | | | | | child_window(title="Owner", auto_id="HeaderItem 3", control_type="HeaderItem")
| | | | | | |
| | | | | | | HeaderItem - 'Group' (L0, T0, R0, B0)
| | | | | | | ['Group', 'HeaderItem5', 'GroupHeaderItem']
| | | | | | | child_window(title="Group", auto_id="HeaderItem 4", control_type="HeaderItem")
| | | | | | |
| | | | | | | HeaderItem - 'Access' (L0, T0, R0, B0)
| | | | | | | ['AccessHeaderItem', 'HeaderItem6', 'Access']
| | | | | | | child_window(title="Access", auto_id="HeaderItem 5", control_type="HeaderItem")
| | | | | |
| | | | | | ScrollBar - 'Vízszintes' (L52, T1935, R356, B1961)
| | | | | | ['Vízszintes', 'VízszintesScrollBar', 'ScrollBar', 'ScrollBar0', 'ScrollBar1']
| | | | | | child_window(title="Vízszintes", auto_id="NonClientHorizontalScrollBar", control_type="ScrollBar")
| | | | | | |
| | | | | | | Button - 'Egy oszloppal balra' (L52, T1935, R78, B1961)
| | | | | | | ['Egy oszloppal balra', 'Egy oszloppal balraButton', 'Button', 'Button0', 'Button1']
| | | | | | | child_window(title="Egy oszloppal balra", auto_id="UpButton", control_type="Button")
| | | | | | |
| | | | | | | Thumb - 'Elhelyezés' (L78, T1935, R126, B1961)
| | | | | | | ['Thumb', 'Elhelyezés', 'ElhelyezésThumb']
| | | | | | | child_window(title="Elhelyezés", auto_id="ScrollbarThumb", control_type="Thumb")
| | | | | | |
| | | | | | | Button - 'Egy oldallal jobbra' (L126, T1935, R330, B1961)
| | | | | | | ['Button2', 'Egy oldallal jobbra', 'Egy oldallal jobbraButton']
| | | | | | | child_window(title="Egy oldallal jobbra", auto_id="DownPageButton", control_type="Button")
| | | | | | |
| | | | | | | Button - 'Egy oszloppal jobbra' (L330, T1935, R356, B1961)
| | | | | | | ['Egy oszloppal jobbraButton', 'Egy oszloppal jobbra', 'Button3']
| | | | | | | child_window(title="Egy oszloppal jobbra", auto_id="DownButton", control_type="Button")
| | | | | |
| | | | | | ListItem - '..' (L52, T274, R1649, B307)
| | | | | | ['ListItem', '..ListItem', '..']
| | | | | | child_window(title="..", control_type="ListItem")
| | | | |
| | | | | Edit - '' (L52, T216, R356, B249)
| | | | | ['Edit2']
| | | | | child_window(auto_id="66952", control_type="Edit")
| | | |
| | | | TabItem - '' (L2, T175, R50, B229)
| | | | ['TabItem', 'TabItem0', 'TabItem1']
| | | |
| | | | TabItem - '' (L2, T229, R50, B283)
| | | | ['TabItem2']
| | | |
| | | | TabItem - '' (L2, T283, R50, B337)
| | | | ['TabItem3']
| | | |
| | | | TabItem - '' (L2, T337, R50, B391)
| | | | ['TabItem4'] -
SzVFE1
csendes tag
Üdv, kezdőként lenne tanácsra szükségem, de gondolom a kérdésből ez fel fog tűnni. MobaXterm app-ban szeretnék műveleteket automatizálni és úgy olvastam, hogy erre a pyWinauto a legalkalmasabb. A MobaXterm -et arra használom, hogy egyszerre indítsak ssh command terminálokat különböző IP-k felé. Az egyes terminálok külön tab-okon jelennek meg a MobaXterm felületén. Azt már elértem, hogy parancsokat tudjak küldeni a terminálokba és váltogatni is tudok a terminálok között, ha CTRL+TAB-ot küldök az ablakba. Következő lépésként azt szeretném elérni, hogy a kód magától felismerje, hogy éppen melyik tab-ban dolgozik a terminálban lévő prompt alapján. Ott akadtam el, hogy kiolvasni sem tudom a prompt-ot, ezt get_line-al próbáltam. Az alábbi módon próbálkoztam:
from pywinauto.application import Application
app = Application(backend='uia').start('"C:\\Program Files (x86)\\Mobatek\\MobaXterm\\MobaXterm.exe"').connect(title='val',timeout=100)
textEditor = app.val.child_window(control_type="Tab").wrapper_object()
print(textEditor.Edit.get_line(0))
textEditor.type_keys("^{TAB 2}")
textEditor.type_keys("test",with_spaces = True)
De az alábbi hibaüzenetet kaptam:print(textEditor.Edit.get_line(0))
AttributeError: 'TabControlWrapper' object has no attribute 'Edit'Tudna segíteni valaki, hogy mit rontottam el?
Új hozzászólás Aktív témák
- MWC 2026: Kedves naplóm!
- Vezeték nélküli fülhallgatók
- MWC 2026: Ha itthon is kapható lesz, a Z Fold becsukhat
- Samsung kuponkunyeráló
- MWC 2026 exkluzív: Bemutatom a Pininfarina mobilt
- Apple MacBook
- Az eddigi legolcsóbb, 3D V-Cache-t használó CPU-ját hozta forgalomba az AMD
- MWC 2026: Bajnoki címre pályázik a Xiaomi Watch 5
- Projektor topic
- Futás, futópályák
- További aktív témák...
- Eladó Lian Li UNI FAN SL120 v2 & SL140 v2 (7db 120 & 2db 140)
- Eladó Dobozos Új ASUS Vivobook 16 Ryzen 9 7940HS 16 GB DDR5 RAM 512ssd FHD+ Garancia
- Szuper áron eladó dobozos Asus Vivobook 16 /Ryzen 5-7530U/16 GB RAM/256 GB SSD/FHD+/IPS/16"/Gari/
- Thinkpad P16s Gen1 16" FHD+ IPS i5-1240P T550 24GB 512GB NVMe ujjolv gar
- Dobozos ASUS TUF A15 Ryzen 7 7735HS 16 GB DDR5 512 GB SSD RTX 4060 140W (8 GB) Garancia
- AKCIÓ! Sosemhasznált! HP OmniBook 5 i3-1315U 8GB 1TB 16" FHD+ Gar.: 1 év
- GYÖNYÖRŰ iPhone 13 128GB Red -1 ÉV GARANCIA - Kártyafüggetlen, MS4393, 100% Akkumulátor
- Cudy LT500D Dual Band 4G/LTE Wi-Fi router / 12 hó jótállás
- Samsung Galaxy S25 FE 8/256GB - ÚJSZERŰ, Kártyafüggetlen - 1 Év Garanciával
- HIBÁTLAN iPhone 14 Plus 128GB Yellow -1 ÉV GARANCIA - Kártyafüggetlen, MS4472
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
