[Python-Frage]Chatfenster mit Namen aus Liste öffnen

09/24/2014 19:10 .yorliK#1
Moin,

ich hab mir mit dem Gui Editor von KaMeR1337 ein Gui mit einer Liste erstellt,
die Liste wird nun mit "später" festgelegten Namen gefüllt, zurzeit nutze ich noch Testnamen. Ich versuche es nun, wie bei der Freundesliste hinzubekommen, sodass bei einem Doppelklick der Name des ausgewählten Listitems ausgelesen und dann ein Chatfenster mit dem Namen geöffnet wird.. Ich hab in der uimessenger.py schon nach Stichworten gesucht, um auf die richtige Stelle zu kommen, allerdings ohne Erfolg :D

Frage also, wie griege ich ein Chatfenster mit einem Namen der vorher aus einer Liste ausgelesen wurde auf?

Pythoncode:
Code:
# Gui generated with Gui Editor by KaMeR1337 ; www.metin2mod.tk
import ui
import dbg
import app
import net
import event
import messenger
import constInfo
import interfaceModule

class Dialog1(ui.Window):
	def __init__(self):
		ui.Window.__init__(self)
		self.BuildWindow()
		self.interface = interfaceModule.Interface()

	def __del__(self):
		ui.Window.__del__(self)

	def BuildWindow(self):
		self.Board = ui.BoardWithTitleBar()
		self.Board.SetSize(100, 100)
		self.Board.SetCenterPosition()
		self.Board.AddFlag('movable')
		self.Board.AddFlag('float')
		self.Board.SetTitleName('Info')
		self.Board.SetCloseEvent(self.Close)
		self.Board.Show()
		self.comp = Component()
		self.list_1, self.ListBox1 = self.comp.ListBoxEx(self.Board, 15, 31, 65, 60)
		Option = ["Buff", "Farmer1", "Farmer2"]
		for opt in Option:
			self.ListBox1.AppendItem(Item(opt))

	def OpenWindow(self):
		if self.Board.IsShow():
			self.Board.Hide()
		else:
			self.Board.Show()

	def Close(self):
		self.Board.Hide()

class Component:
	def Button(self, parent, buttonName, tooltipText, x, y, func, UpVisual, OverVisual, DownVisual):
		button = ui.Button()
		if parent != None:
			button.SetParent(parent)
		button.SetPosition(x, y)
		button.SetUpVisual(UpVisual)
		button.SetOverVisual(OverVisual)
		button.SetDownVisual(DownVisual)
		button.SetText(buttonName)
		button.SetToolTipText(tooltipText)
		button.Show()
		button.SetEvent(func)
		return button

	def ToggleButton(self, parent, buttonName, tooltipText, x, y, funcUp, funcDown, UpVisual, OverVisual, DownVisual):
		button = ui.ToggleButton()
		if parent != None:
			button.SetParent(parent)
		button.SetPosition(x, y)
		button.SetUpVisual(UpVisual)
		button.SetOverVisual(OverVisual)
		button.SetDownVisual(DownVisual)
		button.SetText(buttonName)
		button.SetToolTipText(tooltipText)
		button.Show()
		button.SetToggleUpEvent(funcUp)
		button.SetToggleDownEvent(funcDown)
		return button

	def EditLine(self, parent, editlineText, x, y, width, heigh, max):
		SlotBar = ui.SlotBar()
		if parent != None:
			SlotBar.SetParent(parent)
		SlotBar.SetSize(width, heigh)
		SlotBar.SetPosition(x, y)
		SlotBar.Show()
		Value = ui.EditLine()
		Value.SetParent(SlotBar)
		Value.SetSize(width, heigh)
		Value.SetPosition(1, 1)
		Value.SetMax(max)
		Value.SetLimitWidth(width)
		Value.SetMultiLine()
		Value.SetText(editlineText)
		Value.Show()
		return SlotBar, Value

	def TextLine(self, parent, textlineText, x, y, color):
		textline = ui.TextLine()
		if parent != None:
			textline.SetParent(parent)
		textline.SetPosition(x, y)
		if color != None:
			textline.SetFontColor(color[0], color[1], color[2])
		textline.SetText(textlineText)
		textline.Show()
		return textline

	def RGB(self, r, g, b):
		return (r*255, g*255, b*255)

	def SliderBar(self, parent, sliderPos, func, x, y):
		Slider = ui.SliderBar()
		if parent != None:
			Slider.SetParent(parent)
		Slider.SetPosition(x, y)
		Slider.SetSliderPos(sliderPos / 100)
		Slider.Show()
		Slider.SetEvent(func)
		return Slider

	def ExpandedImage(self, parent, x, y, img):
		image = ui.ExpandedImageBox()
		if parent != None:
			image.SetParent(parent)
		image.SetPosition(x, y)
		image.LoadImage(img)
		image.Show()
		return image

	def ComboBox(self, parent, text, x, y, width):
		combo = ui.ComboBox()
		if parent != None:
			combo.SetParent(parent)
		combo.SetPosition(x, y)
		combo.SetSize(width, 15)
		combo.SetCurrentItem(text)
		combo.Show()
		return combo

	def ThinBoard(self, parent, moveable, x, y, width, heigh, center):
		thin = ui.ThinBoard()
		if parent != None:
			thin.SetParent(parent)
		if moveable == TRUE:
			thin.AddFlag('movable')
			thin.AddFlag('float')
		thin.SetSize(width, heigh)
		thin.SetPosition(x, y)
		if center == TRUE:
			thin.SetCenterPosition()
		thin.Show()
		return thin

	def Gauge(self, parent, width, color, x, y):
		gauge = ui.Gauge()
		if parent != None:
			gauge.SetParent(parent)
		gauge.SetPosition(x, y)
		gauge.MakeGauge(width, color)
		gauge.Show()
		return gauge

	def ListBoxEx(self, parent, x, y, width, heigh):
		bar = ui.Bar()
		if parent != None:
			bar.SetParent(parent)
		bar.SetPosition(x, y)
		bar.SetSize(width, heigh)
		bar.SetColor(0x77000000)
		bar.Show()
		ListBox=ui.ListBoxEx()
		ListBox.SetParent(bar)
		ListBox.SetPosition(0, 0)
		ListBox.SetSize(width, heigh)
		ListBox.Show()
		scroll = ui.ScrollBar()
		scroll.SetParent(ListBox)
		scroll.SetPosition(width-15, 0)
		scroll.SetScrollBarSize(heigh)
		scroll.Show()
		ListBox.SetScrollBar(scroll)
		return bar, ListBox

class Item(ui.ListBoxEx.Item):
	def __init__(self, text):
		ui.ListBoxEx.Item.__init__(self)
		self.canLoad=0
		self.text=text
		self.textLine=self.__CreateTextLine(text[:50])
	def __del__(self):
		ui.ListBoxEx.Item.__del__(self)
	def GetText(self):
		return self.text
	def SetSize(self, width, height):
		ui.ListBoxEx.Item.SetSize(self, 2*20-4, height)
	def __CreateTextLine(self, text):
		textLine=ui.TextLine()
		textLine.SetParent(self)
		textLine.SetPosition(0, 0)
		textLine.SetText(text)
		textLine.Show()
		return textLine

Dialog1().Show()
09/28/2014 16:50 Jоe#2
Code:
#uimessenger.py
class MessengerItem(ui.Window):
	def __init__(self, getParentEvent):
		ui.Window.__init__(self)

		self.SetParent(getParentEvent())
		...
		self.getParentEvent = getParentEvent	
	def GetName(self):
		return self.name
	def OnWhisper(self):
		pass	
class MessengerMemberItem(MessengerItem):
	def IsOnline(self):
		if self.STATE_ONLINE == self.state:
			return TRUE

		return FALSE
	def OnWhisper(self):
		if self.IsOnline():
			self.getParentEvent().whisperButtonEvent(self.GetName()
class MessengerWindow(ui.ScriptWindow):
	def __init__(self):
		...
		self.selectedItem = None
		self.whisperButtonEvent = lambda *arg: None
	def SetWhisperButtonEvent(self, event):
		self.whisperButtonEvent=event
	def OnPressWhisperButton(self):
		if self.selectedItem:
			self.selectedItem.OnWhisper()
Ich weiß nicht wo das Problem liegt. - Es ist eine reine Python Verständnissache.
09/28/2014 19:23 .yorliK#3
Danke erstmal für die Antwort, aber wo ist da jetzt die Funktion? ich sehe da keine, welche bei Doppelklick auf den Namen das Chatfenster öffnet. Das ist ja grade das Problem..
09/28/2014 19:34 Jоe#4
Habs nicht ganz gelesen, dennoch dasselbe Prinzip.
Code:
def OnMouseLeftButtonDoubleClick(self):
		self.getParentEvent().OnDoubleClickItem(self)	def OnDoubleClickItem(self, item):

		if not self.selectedItem:
			return

		if self.selectedItem.IsOnline():
			self.OnPressWhisperButton()
Es ist daher nicht unbedingt "eine" Funktion, da es ein System(mit mehreren Klassen, die wiederum Methoden besitzen) ist und viele Faktoren entscheidend sind.
09/28/2014 20:20 .yorliK#5
Das heißt also, ich muss ziemlich viel machen, nur um das Chatfenster mit nem Namen zu öffnen? Es geht mir nicht darum ob der Spieler online ist, es soll einfach ein Chatfenster mit den Name geöffnet werden..
Man kann es ja per Shift+Enter holen, leider finde ich die Funktion im Client dafür nicht, habe mir in der game.py alle onPressKeyDict's angeschaut..
09/28/2014 20:35 Jоe#6
Quote:
Originally Posted by Kilroy. View Post
Das heißt also, ich muss ziemlich viel machen, nur um das Chatfenster mit nem Namen zu öffnen? Es geht mir nicht darum ob der Spieler online ist, es soll einfach ein Chatfenster mit den Name geöffnet werden..
Man kann es ja per Shift+Enter holen, leider finde ich die Funktion im Client dafür nicht, habe mir in der game.py alle onPressKeyDict's angeschaut..
Oh jee...
Du könntest natürlich auch auf die Datei "uimessenger.py" verweisen und bestehende Klassen/Methoden verwenden. Aber wenn dir das schon schwer fällt, würde ich mir erst mal Python genauer anschauen, bevor ich da was rum ändere.
10/01/2014 01:43 .He3o Copy™#7
Nunja ich hab jetzt oft gelesen das du den Leuten viel bei Quests geholfen hast da hab ich mir gedacht, der Kerl hat es verdient das man ihm auch etwas hilft.
Ich weiß nicht genau wie du dir das vorgestellt hast.
Möchtest du direkt eine Nachricht an den Spieler senden oder einfach nur ein Whisperchat öffnen mit einem bestimmten namen? Ich mach dir einfach mal ein Beispiel mit der Lösung 2.

PHP Code:
def OpenWhisperChat(self, parameter):
    
import chat
    chat
.CreateWhisper(parameter)
    
chat.SetWhisperBoxSize(parameter, self.GetWidth() - 60, self.GetHeight() - 90) 
als Funktion zur Chatöffnung, müsste in der Theorie gehen ist leider untested.

In die BuildWindow Funktion noch das hier hinzufügen:
PHP Code:
self.ListBox1.SetSelectEvent(self.OnDoubleClickItem) 
noch eine neue Funktion:
PHP Code:
def OnDoubleClickItem(self, item1):
    
self.OpenWhisperChat(item1.getText()) 
Das Ganze geht natürlich viel kürzer aber ich wollte es mal etwas übersichtlicher machen :)


Viel Spaß damit

Copy


PS: Falls etwas nicht klappen sollte poste einfach die Fehler
10/01/2014 16:32 .yorliK#8
Vielen Dank! Echt klasse, das du mir hilfst!

Fehler bekomme ich keine, allerdings wird kein "Whisperchat" geöffnet. Ich hab mal, um zu schauen, ob der Name denn richtig ausgelesen wird (vielleicht öffnet sich deswegen kein Chatfenster), den Namen im Chat zeigen lassen.
PHP Code:
chat.AppendChat(chat.CHAT_TYPE_INFO, item1.GetText()) 
So habe ich herausgefunden, dass der Name richtig ausgelesen wird, außerdem habe ich herausgefunden, das die Funktion OnDoubleClickItem schon bei einem einmaligen Klick ausgeführt wird. Nur der "Whisperchat" öffnet sich nicht.
10/01/2014 16:50 .He3o Copy™#9
Quote:
Originally Posted by Kilroy. View Post
Vielen Dank! Echt klasse, das du mir hilfst!

Fehler bekomme ich keine, allerdings wird kein "Whisperchat" geöffnet. Ich hab mal, um zu schauen, ob der Name denn richtig ausgelesen wird (vielleicht öffnet sich deswegen kein Chatfenster), den Namen im Chat zeigen lassen.
PHP Code:
chat.AppendChat(chat.CHAT_TYPE_INFO, item1.GetText()) 
So habe ich herausgefunden, dass der Name richtig ausgelesen wird, außerdem habe ich herausgefunden, das die Funktion OnDoubleClickItem schon bei einem einmaligen Klick ausgeführt wird. Nur der "Whisperchat" öffnet sich nicht.
OnDoubleClickItem ist ein beliebiger Name da müsstest du noch eine Abfrage rein hauen wenn es nur alle 2 mal ausgeführt werden soll. Naja dann muss es wohl umständlicher sein...
Leider hab ich gerade kein Server zum testen da...

Probiere einfach mal
PHP Code:
self.interface = interfaceModule.Interface()
self.interface.RecvWhisper(parameter) 
10/01/2014 17:18 .yorliK#10
Quote:
Originally Posted by .He3o Copy™ View Post
OnDoubleClickItem ist ein beliebiger Name da müsstest du noch eine Abfrage rein hauen wenn es nur alle 2 mal ausgeführt werden soll. Naja dann muss es wohl umständlicher sein...
Leider hab ich gerade kein Server zum testen da...

Probiere einfach mal
PHP Code:
self.interface = interfaceModule.Interface()
self.interface.RecvWhisper(parameter) 
Mh okay, ich dachte OnDoubleClickItem wird wie OnUpdate erkannt :D

RecvWhisper habe ich, nachdem ich das Gui entworfen hatte, gleich als erstes ausprobiert, da kam aber der gleiche Fehler wie jetzt.

Code:
1001 17:18:14544 ::   File "interfaceModule.py", line 1281, in RecvWhisper

1001 17:18:14544 :: AttributeError
1001 17:18:14544 :: : 
1001 17:18:14544 :: 'Interface' object has no attribute 'whisperDialogDict'
1001 17:18:14544 ::
10/01/2014 17:27 .He3o Copy™#11
Quote:
Originally Posted by Kilroy. View Post
Mh okay, ich dachte OnDoubleClickItem wird wie OnUpdate erkannt :D

RecvWhisper habe ich, nachdem ich das Gui entworfen hatte, gleich als erstes ausprobiert, da kam aber der gleiche Fehler wie jetzt.

Code:
1001 17:18:14544 ::   File "interfaceModule.py", line 1281, in RecvWhisper

1001 17:18:14544 :: AttributeError
1001 17:18:14544 :: : 
1001 17:18:14544 :: 'Interface' object has no attribute 'whisperDialogDict'
1001 17:18:14544 ::
schick mal dein interfacemodul
10/01/2014 17:35 .yorliK#12
Ist im Anhang, ich hab mir die aber auch schon angeschaut und da ist "whisperDialogDict" vorhanden.. daher verstehe ich den Fehler nicht :D
10/01/2014 17:54 .He3o Copy™#13
Ok sollte soweit passen aber ich Freunde mich mit der aufwendigen Methode nicht so ganz an ich teste das iwie heute nochmal...
10/01/2014 17:59 .yorliK#14
Quote:
Originally Posted by .He3o Copy™ View Post
Ok sollte soweit passen aber ich Freunde mich mit der aufwendigen Methode nicht so ganz an ich teste das iwie heute nochmal...

Du kannst auch bei mir per TeamViewer testen, wenn du möchtest. Ich hab damit kein Problem, gibt nichts zu verheimlichen :D