Több ablak, mint kellene..

Indította szabika1232, 2018-02-11, 15:17:16

Sziasztok!
Viccesen hangzik, de már több mint 1 napja szenvedek egy olyan problémával, amit valószínűleg a világon a legegyszerűbb megoldani.
A képen látszik, hogy 2 ablak van megnyitva.
Nos, ez az egész "rendszer" az f5 billentyűre van rakva, és amikor megnyomom előhoz egy ablakot, viszont, ha megint megnyomom újra előhoz egy ablakot, nem pedig bezárja.
A célom az lenne, hogy ha egyszer lenyomom az f5-öt behozza az ablakot,ha megint megnyomom bezárja.

Game.py
[spoiler]
def __TesztGomb(self):
      import uitesztwindow
      #import net
      #net.SendChatPacket("Fekete_chat")--Csak teszt volt, hogy működik-e a gomb.
      a = uitesztwindow.TesztWindow()
      if constInfo.teszt11 == 0:
         constInfo.teszt11 = 1-----A cosntinfoban természetesen ott a teszt11 = 0
         a.Show()
      elif constInfo.teszt11 == 1:
         constInfo.teszt11 = 0
         a.Close()
[/spoiler]
uitesztwindow.py
[spoiler]
import ui

class TesztWindow(ui.Window):
   def __init__(self):
      ui.Window.__init__(self)
      self.BuildWindow()
      
   def __del__(self):
      ui.Window.__del__(self)
      
   def Show(self):
      ui.Window.Show(self)
      
   def Close(self):
      self.Board.Hide()
      return TRUE
      
   def BuildWindow(self):
      self.Board = ui.BoardWithTitleBar()
      self.Board.SetSize(200, 200)
      self.Board.SetCenterPosition()
      self.Board.AddFlag('movable')
      self.Board.AddFlag('float')
      self.Board.SetTitleName('Szeretem az őSZt!')
      self.Board.SetCloseEvent(self.Close)
      self.Board.Show()
      
   def OnPressEscapeKey(self):
      self.Close()
      return TRUE
# END
[/spoiler]

Próbáltam ezer másik switchbotról,killguiról lemásolni ezt a részt, de folyton 10+ ablakkal lépek ki a játékból és megyek vissza a googlehez..
Nem vagyok egy nagy mestere a pythonnak, miközben keresgélek mennek a tutorialok, de erről semmit nem találtam..Lehet velem van a baj, de tényleg eltöltöttem legalább 2órát a keresgéléssel. Tudom, hogy nem fognak/fogtok minden megcsinálni helyettem(és nem is szeretném ezt), de tényleg elkelne egy kis segítség. :'D
#Nemleszélesszerver >:( :(

Remélem érthető a gondom, és a célom is.
Előre is köszönöm az értelmes, segítőkész válaszokat!
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

Több probléma is van ebben, de vegyük őket sorba.

1. Ne game-ben csinálj ablakot, hanem interfacemodule-ban.
2. Felül az __init__ függvényben hozz létre egy változót az ablaknak, például ezt: self.testWindow = None
3. A funkcióban ennek a változónak add meg az ablak értékét, ne pedig hozz létre egy újat.

Tehát:

import uitesztwindow
def ToggleTestWindow(self):
if not self.testWindow:
self.testWindow = uitesztwindow.TesztWindow()
self.testWindow.Show()
return

if self.testWindow.IsShow():
self.testWindow.Hide()
else:
self.testWindow.Show()


Az interfacemodule-ban lévő Close-ba pedig írd bele, hogy a testWindow is bezáródjon, különben kilépésnél ott fog maradni.

Idézetet írta: [VIP]Disco Dátum 2018-02-11, 15:30:16
1. Ne game-ben csinálj ablakot, hanem interfacemodule-ban.

Ezt, hogy érted? Az ablak egy külön .py fájlban van, a game-ben csak az van, hogy az f5 lenyomásakor mi történjen.
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

Sztem felesleges az interfacebe nyúlkálni, én csak game-ben oldom meg a dolgot.
class GameWindow(ui.ScriptWindow):
def __init__(self, stream):

ide létrehozol 1 új változót pl
self.switchbot = None
Kicsit lejjebbmész a bezáráshoz
def Close(self):
és ide is bemásolod ugyanazt a kódot mint előbb, majd jöhet a megnyitás.
def Switchbot(self):
if not self.switchbot:
self.switchbot = pyfájlneve.classneve()

if self.switchbot.IsShow():
self.switchbot.Close()
else:
self.switchbot.Show()

Sikerül megoldanom, kicsit másképp, mint ahogy leírtátok, de működik.
Egy olyan kérdésem lenne még, hogy miután megnyitom ezt az ablakot és megnyomom az ESC-et, miért nem hozza be a megszokott menüt?
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup



Lehet azért mert bezárja elvileg az ablakot? ???
A buta emberek különös szenvedélyt táplálnak az olyan következtetések iránt, amelyekre a maguk eszével jutottak.
Lev Tolsztoj

Fogalmam sincs, hogy mi az ESC nem működésének oka.

Ezt azért raktam bele, hogy az ESC-vel is betudjam zárni az ablakot.
Lényegében, mint a leltárnál. Ha meg van nyitva és megnyomod az ESC-t bezárja a leltárt, ha újra megnyomod előjön a menü.
Nálam az ESC semmit nem csinál, miután megnyitom az ablakot és bezárom. :/
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

Vmi mással akadhat össze mert nálam tök szépen workingel a dolog.
Akár Esc-el zárom be az ablakot, akár ki X-elem utána ugyanúgy jó az Esc továbbra is.

Van rá valami megoldás, vagy vegyem ki és felejtsem el?
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

Ha nem hozod elő a switchbotot, akkor alapjáraton működik az esc v úgy se?

Úgy működik, de miután behozom, már nem.
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

Akkor esetleg mutasd meg mi az a másik mód ahogy megoldottad.
Csak arra tudok tippelni mivel amit én leírtam korábbi hsz-emben azzal tökéletesen működik és az esc-et se rontja el.

[spoiler]
if not self.testWindow:
         self.testWindow = uibonus.BonusWindow()
         self.testWindow.Show()
         return
         
      if self.testWindow.IsShow():
         self.testWindow.Close()
         self.testWindow = None
[/spoiler]
Annyit változtattam, hogy ezt: self.testWindow = None nem a def Close részhez raktam, mert így működik csak.
Megnézdnéd nekem, hogy az OnPressEscapeKey funkcióhoz neked mi van írva?
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

uiinventoryból copyztam ki, ugyanaz mint ami a képen van feljebb.
def OnPressEscapeKey(self):
self.Close()
return True

Mostmár működik az ESC is, viszont ha ezzel lépek ki, akkor kétszer kell f5-öt nyomnom, mivel gondolom nem állítja vissza a self.testWindow "None" értékre.
Erre valami megoldás?  >:(
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

Mert te másképp írtad meg azért nem jó.
Nálam a Close és Show állít 1 változót
def Show(self):
self.show = True
ui.ScriptWindow.Show(self)

def Close(self):
self.show = False
self.ClearAll()
self.Hide()

amit az IsShow ad vissza, így tudom h nyitva van-e v sem.
def IsShow(self):
return self.show

És ez alapján írtam a kódot a megnyitásra:
def WhisGradeUpgrade(self):
if not self.whisgrade:
self.whisgrade = uiWhisGrade.WhisGradeWindow()

if self.whisgrade.IsShow():
self.whisgrade.Close()
else:
self.whisgrade.Show()

Ha még nincs ilyen ablak, azaz 1. lefutásról van szó, akkor létrehozza, alapból False értéken van a show, tehát az else ág fog lefutni így egyből megnyitja az ablakot.
Utána már csak váltakozva fut le kód.
Felesleges töröltetni az ablakot minden bezárásnál, elég a Show/Hide.

Hát ez nem jön össze :x
“C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.” ― Bjarne Stroustrup

hm?? ???

if a.IsShow():
a.Close()


constinfo fv-t felejtsd el belőle, a kliens nem tud olyan gyorsan értéket átírni.

Még game.py-on belül lehet globális változót is használni, több mód van rá.

Nekem alapból létezik IsShow, de ha nektek nincs:

ui.py Window classba ezt kell betenni:

def IsShow(self):
return wndMgr.IsShow(self.hWnd)