Why my Haskell game sometimes responds differently to the same arguments? [closed] - haskell
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 4 years ago.
Improve this question
I am working on a simple Gtk/Cairo game:
https://github.com/bigos/cairo-example/blob/9ac6f39d53cd27f36cad53a265e05f3e45564a37/src/Main.hs
I have noticed a problem where sometimes my snake doesn't eat food. I have figured out how to log subsequent versions of global state.
I have this debuggator function, which tests versions dumped by the logger.
debuggator =
let m1 = Model {debugData = "", eaten = 5, foodItems = [(6,2)], gameField = Move, snakeLength = 0, heading = HeadingUp, height = 400, lastKey = 65362, scale = 25, snake = [(6,3),(6,4),(5,4),(4,4),(3,4),(2,4),(1,4),(0,4),(-1,4),(-2,4),(-2,3),(-2,2),(-2,1),(-2,0),(-1,0),(0,0),(1,0),(2,0),(3,0),(4,0)], tickInterval = 500.0, seed = 36, width = 600}
m2 = Model {debugData = "", eaten = 5, foodItems = [(6,2)], gameField = Move, snakeLength = 0, heading = HeadingUp, height = 400, lastKey = 65362, scale = 25, snake = [(6,2),(6,3),(6,4),(5,4),(4,4),(3,4),(2,4),(1,4),(0,4),(-1,4),(-2,4),(-2,3),(-2,2),(-2,1),(-2,0),(-1,0),(0,0),(1,0),(2,0),(3,0)], tickInterval = 500.0, seed = 36, width = 600}
m3 = Model {debugData = "", eaten = 5, foodItems = [(6,2)], gameField = Move, snakeLength = 0, heading = HeadingRight, height = 400, lastKey = 65363, scale = 25, snake = [(6,1),(6,2),(6,3),(6,4),(5,4),(4,4),(3,4),(2,4),(1,4),(0,4),(-1,4),(-2,4),(-2,3),(-2,2),(-2,1),(-2,0),(-1,0),(0,0),(1,0),(2,0),(3,0)], tickInterval = 500.0, seed = 37, width = 600}
ma = updateGlobalModel Tick m1
mb = updateGlobalModel Tick ma
in
[ma,mb]
which returns the following:
λ> debuggator
[Model {debugData = "", eaten = 5, foodItems = [(6,2)], gameField = Move, snakeLength = 0, heading = HeadingUp, height = 400, lastKey = 65362, scale = 25, snake = [(6,2),(6,3),(6,4),(5,4),(4,4),(3,4),(2,4),(1,4),(0,4),(-1,4),(-2,4),(-2,3),(-2,2),(-2,1),(-2,0),(-1,0),(0,0),(1,0),(2,0),(3,0)], tickInterval = 500.0, seed = 36, width = 600},
Model {debugData = "(\"** eaten **\",(6,2),[(6,2)])", eaten = 6, foodItems = [(2,5),(0,2),(10,4)], gameField = Move, snakeLength = 3, heading = HeadingUp, height = 400, lastKey = 65362, scale = 25, snake = [(6,1),(6,2),(6,3),(6,4),(5,4),(4,4),(3,4),(2,4),(1,4),(0,4),(-1,4),(-2,4),(-2,3),(-2,2),(-2,1),(-2,0),(-1,0),(0,0),(1,0),(2,0),(3,0)], tickInterval = 500.0, seed = 36, width = 600}]
In this example ma corresponds to m2 which values was copied from the real game. Processing ma leads to mb, which shows that snake has eaten the food, but in real game progressing from m2 to m3 did not lead to snake eating food. the snake head has moved over the food item and the list of food items did not change. In the repl example mb has 3 food items because the last food item was eaten and 3 more were generated.
Why does function respond differently to the same arguments? does calling a pure function from IO have some unexpected effects?
Function that checks id the snake has eaten food is at line 110:
foodEaten :: Model -> Bool
foodEaten model =
any id (map (\c -> (fst c)==cx && (snd c)==cy) (foodItems model))
where hsm = head (snake model)
cx = fst hsm
cy = snd hsm
That in turn is called by cook function at line 293:
cook :: Model -> Model
cook model =
if foodEaten model
then model { gameField = detectCollision model
, snakeLength = (snakeLength model) +3
, foodItems = filter (\c -> not (foodUnderHead c model)) (foodItems model)
, debugData = (debugData model) ++ (show ("** eaten **" :: String, head (snake model), (foodItems model)))
, eaten = (eaten model) + 1 }
else model { gameField = detectCollision model
, snakeLength = shrink (snakeLength model)
, debugData = "" }
For some reason the snake does not detect if the food was eaten. One commenter has suggested to check if my code is thread safe.
Debuggator function at line 273 tries to illustrate simple case that always works. function cook that fails in some situations is called indirectly at main function line line 295. There a timer events are defined which call updateGlobalModel Tick
_ <- GI.GLib.timeoutAdd GI.GLib.Constants.PRIORITY_DEFAULT 500 ( modifyIORef' globalModel (updateGlobalModel Tick) >>
Gtk.widgetQueueDraw canvas >> return True)
Debuggator function illustrates how I can call it in REPL. However, as someone suggested that could be a thread problem. My Haskell skills are still poor and I do not know how to investigate it properly.
Related
vpython camera movement: how to walk around a tree?
I try to move the camera in a circular path around a couple of objects, with the camera always directing to the center. Simplified, up to now I have the following code (displaying a "tree" with a "small stone" to keep track of the movement): import vpython stem = vpython.cylinder(pos = vpython.vector(0, -1, 0), axis = vpython.vector(0,4,0), length = 2, radius = 0.2) crown = vpython.sphere(pos = vpython.vector(0, 1.5, 0), radius=0.5) stone = vpython.sphere(pos = vpython.vector(1, -1.5, 0), radius=0.1) sposi = vpython.scene.camera.pos # Startposition abst = vpython.mag(sposi) sollwinkel = 95 ziel_x = abst * vpython.cos(sollwinkel) ziel_y = abst * vpython.sin(sollwinkel) d_x = ziel_x / 100.0 d_y = ziel_y / 100.0 calc_x = 0 while True: vpython.rate(20) while calc_x < d_x: calc_x = calc_x + d_x vpython.scene.camera.pos = vpython.vector(sposi.x + d_x, sposi.y + d_y, sposi.z) #vpython.scene.camera.axis = vpython.vector(sposi.x - d_x, sposi.y - d_y, -sposi.z) vpython.sleep(0.1) I got some movement, but not circular around the center. And the camera axis probably has to be defined in another way, but I can't figure out, how. Actually, it jumps too near to the tree? Thanks in advance for all help!
The initial camera position is <0, 0, 1.73205>, and sposi is <0.012647, 0.0118344, 1.73205>, so naturally you don't see any change. Not sure what you're trying to do. I do recommend posting such questions to the VPython forum at https://groups.google.com/forum/?fromgroups&hl=en#!forum/vpython-users
Attaching a scrollbar to a listbox
I know that there have been some other questions about this, but was hoping to get some help with my current frame configuration as seen below in the code snippet. I have also attached some images, first is with no scrollbar set up. Second is when I uncommented out my scrollbar code. Frame setup: # -- Top Frame -- # self.top = Frame(master, height = 71, bg = self.topColor) self.top.pack(fill = X) self.bottom = Frame(master, height = 650, bg = self.bottomColor) self.bottom.pack(fill = X) Listbox setup: # myscroll = Scrollbar(self.bottom, orient = VERTICAL) Label(self.bottom, text = 'Files Chosen:', bg = self.bottomColor).place(x = 4, y = 110) self.qListBox = Listbox(self.bottom, width = 30, selectmode = SINGLE) # I did have yscrollcommand = myscroll # myscroll.config(command = self.qListBox.yview) # myscroll.pack(side = RIGHT, fill = Y) self.qListBox.place(x = 4, y = 130) Label(self.bottom, text = 'Deployment Queue:', bg = self.bottomColor).place(x = 360, y = 110) self.dListBox = Listbox(self.bottom, width = 30, selectmode = MULTIPLE) self.dListBox.place(x = 360, y = 130)
Figured out how to resolve this. Created three frames that are inside of my master frame as seen below: my_frame = Frame(self.master) my_secondF = Frame(self.master) my_thirdF = Frame(self.master) Once I did this I simply put my Lisboxes inside of those frames and placed them accordingly and configured my scrollbars self.qListBox = Listbox(my_frame, yscrollcommand=myscroll_bar, width = 32, selectmode = SINGLE) I still, however, appreciate all the replies :)
Click a point on Dot-plot in Shiny R
I am working on a Shiny App design and I wonder how to click a point on a dot-plot in Shiny R. I want to design an app that if the users select a point on the dot-plot, they can see the correspond table (3 columns ). The plot is a p-value distribution. The following is my code: ui: library(shiny) library(shinythemes) library(pander) fluidPage(theme = shinytheme("flatly"), titlePanel(h3("Chi-Squared Goodness-fit-Test and Simulation ")), fluidRow( column(3, offset = 0.5,wellPanel( sliderInput("n", "Number of Samples:", min = 10, max = 1000, value = 50 , step = 1), sliderInput("n2", "The number of Categories:", min = 1, max = 8, value = 5 , step = 1) , sliderInput("n3", "The number of Simulation:", min = 1, max = 1000, value = 5 , step = 1), submitButton("Submit") )), column(7,align="center", tableOutput("values")), column(5,offset=1, align="center", plotOutput("plot1", click=" Click" ,width = 600, height = 430) ) ) ) server: library(shiny) library(shinythemes) library(pander) function(input, output) { output$plot1 <- renderPlot({ num_of_samples = input$n nn= input$n2 ss= input$n3 pp=numeric(0) for(i in 1:ss){ x <- sample(1:nn,num_of_samples,replace=T) nulls=1/(1:nn) total=table(x) expected=nulls*total a <- chisq.test(table(x), correct= FALSE, rescale.p=TRUE ) pp[i]=a$p.value } if (ss<=50) {stripchart(pp,method = "stack",offset = 0.8, at = .15, pch = 19, main="P-value Distribution of Chi-Squared Test", xlab="P Value")} else {hist(pp,breaks=5,main="P-value Distribution of Chi-Squared Test", xlab="P Value")} }) sliderValues <- reactive({ num_of_samples = input$n nn= input$n2 # pp=numeric(0) x <- sample(1:nn,num_of_samples,replace=T) # Compose data frame xx=cbind(paste0(LETTERS[1:nn]),table(x ),round(rep(num_of_samples/nn,nn),2)) xx=as.data.frame(xx) colnames(xx)=c("Categories","Observed Value","Expected Value") xx }) output$values <- renderTable({ sliderValues()}, align="c" ) }
Using a table in Lua to display text isn't working?
I'm using Corona SDK, Sublime Text 3, and Lua. My goal in this particular program is to make a visual novel app that changes when the player clicks on the text displayed at the bottom of the screen to progress to the next text entry, therefore continuing the story. I set up a bunch of code for logo, title screen, and other things, that works perfectly. What I'm currently trying to do within the visual novel scene is to use a table to draw the text from by change the .TEXT property to select a certain value from the table, therefore selecting the text and making that the new text. Basically, something like... (some dummy code below) novelText = display.newText (insert the parameters for old text and the old text) --the variable used to call the value in the table page = 1 dummy table Novel_pages = { [1] = nil, [2] = "new text" } (insert runtime event here that calls this function) page = page + 1 novelText.text = Novel_pages[page] display.newText(novelText) That was just dummy code, so please don't mind the format. :) I just want to show how I attempted to call these values from the table, and to show what I was doing without having to make people look through all my code. So everything works fine in Corona SDK simulator, with the text even changing just momentarily -- until one second later, I get a message that reads "mainl.lua:160: bad argument #1 to 'newText' (string expected, got table) stack traceback: [C]: in function 'NewText' main.lua:160: in function <main.lua: 156> ?: in function <?169>" Now's the part where I give you all my code! I hope it's not too much, and that I specified the problem enough. I can't see where I made the error in the table, since it should be JUST replacing the .text and not all the other properties? And then displaying with the new text properties and not have to reference the table at all afterwards? Perhaps there's a problem with needing the program to process the .text change before displaying the visual novel text... Anyway, please help me! I would appreciate knowing what went wrong here, or being proposed an alternative! And thank you so much :) Here's the code -- everything starts in function sceneVN()! And please excuse my cringy dialogue ingame c: It's a practice project! local store = require( "plugin.google.iap.v3" ) local composer = require("composer") local scene = composer.newScene() display.setStatusBar( display.HiddenStatusBar ) -- Removes status bar coins = 5 -- variable that defines the number of coins player has in the game.It will be different --in a stand alone game, but as a small app meant to demonstrate function, it's necessary to start off --with a small, defined number in the beginning. local logo = display.newImage("/Images/logo.png", 155, 275) --code for my personal logo, drawn by me. --Not actually showcased in the video because of time limit. logo.alpha = 0 local function makeTitleTrue() logo:removeSelf() print("menu should be TRUE") titleScreen() end local function fadeOut() transition.to(logo, {time = 1000, alpha = 0, onComplete = makeTitleTrue}) end transition.to(logo, {time = 1000, alpha = 1, onComplete = fadeOut}) -- end of logo code function titleScreen() -- beginning of title code, which is not managed as a separate scene title = true titleImg = display.newImage("/Images/vn_bg.png", 155, 275) --titleWords = display.newImage("/Images/TitleWords.png", 155, 275) --fix to flow towards the upper right corner. local flare = display.newImage("/Images/flare2.png", 40, 30) flare.xScale = .5 flare.yScale = .5 local flare2 = display.newImage("/Images/flare2.png", 400, 70) flare2.xScale = .6 flare2.yScale = .6 local flare3 = display.newImage("/Images/flare2.png", -30, 100) flare3.xScale = .4 flare3.yScale = .4 local flare4 = display.newImage("/Images/flare2.png", 100, 400) flare4.xScale = .4 flare4.yScale = .4 local flare5 = display.newImage("/Images/flare2.png", 400, 400) flare5.xScale = .3 flare5.yScale = .3 local flare6 = display.newImage("/Images/flare2.png", 250, 200) flare6.xScale = .3 flare6.yScale = .3 local function moveFlare1() transition.to(flare, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare1}) end local function moveFlare2() transition.to(flare2, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare2}) end local function moveFlare3() transition.to(flare3, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare3}) end local function moveFlare4() transition.to(flare4, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare4}) end local function moveFlare5() transition.to(flare5, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare5}) end local function moveFlare6() transition.to(flare6, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare6}) end transition.to(flare, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare1}) transition.to(flare2, {time=2500, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare2}) transition.to(flare3, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare3}) transition.to(flare4, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare4}) transition.to(flare5, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare5}) transition.to(flare6, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare6}) --add options that can when the screen is tapped, tap on an option twice to select -- start story -- continue story -- coin gambling -- end game if (title == true) then Runtime:addEventListener("tap", sceneVN) end end function forceQuit() function quit() os.exit() end timer.performWithDelay(1000,quit) end function sceneVNChapter2() return end function sceneVN() -- the actual visual novel code itself display.remove(titleImg) --display.remove(titleWords) display.remove(flare) display.remove(flare2) display.remove(flare3) display.remove(flare4) display.remove(flare5) display.remove(flare6) title = false local coinSheetData = { width = 32, height = 32, numFrames = 8, } local coinimageSheet = graphics.newImageSheet( "/Images/spinning_coin.png", coinSheetData ) local sequenceData = { name= "spinning_coin", start = 1, count = 8, time = 1000, loopCount = 0 } --the properties of the name plate that can be changed ingame by using ".text" property local nameOptions = { text = "Frankenstein", x = 165, y = 450, width = 310, font = "Charlesworth.ttf", fontSize = 22, align = "left" } local bg = display.newImage("/Images/bg4.jpg", 155, 275) textRect = display.newRect(155, 525, 325, 200) textRect:setFillColor(.02, .02, .02) textRect.alpha = .6 page = 1 local frames = display.newImage("/Images/windowframes_gold.png", 155, 275) display.newText(nameOptions) local VN_pages = { [1] = nil, [2] = "\"Then, seeing as this is a simulation of\n a visual novel dating sim, I have no\n choice but to ask you...\"", [3] = "\"My lady, would you go on a date with me?\nFrankenstein... butler of the fineest noble,\nCadis Etrama di Raizel?\"", [4] = "duck", [5] = "duck", [6] = "duck", } local displayNovelText = display.newText("\"I see. So I\'m supposed to pretend I am\na character in a multi-chapter phone\napp that you\'ve been reading...\"", 165, 500, "Goudy Old Style Regular.ttf", 17) function changePage() print("dang it") page = page + 1 displayNovelText.text = VN_pages[page] display.newText(displayNovelText) end textRect:addEventListener("tap", changePage) if (coins < 10) then coinsDigits = 2 else if (coins > 9) and (coins < 100) then coinsDigits = 3 else if (coins > 99) and (coins < 1000) then coinsDigits = 4 else if (coins > 999) and (coins < 10000) then coinsDigits = 5 else if (coins > 9999) and (coins < 100000) then coinsDigits = 6 end end end end end cooin = display.newSprite(coinimageSheet, sequenceData) cooin.x = 25 cooin.y = 30 cooin:play() coinText = display.newText("1", 57 + 4 * coinsDigits, 32, "VCR_OSD_MONO_1.001.ttf", 25) coinText.text = coins coinTimer = timer.performWithDelay(2000, cooin, 1) end function choiceMade( event ) --the scenes where all the choices are made if (event.action == "clicked") then local i = event.index if (i == 1) then Runtime:removeEventListener() titleScreen() else if (i == 2) then system.openURL( "https://www.paypal.com/us/home" ) else if (i == 3) then return end end end end end -- end of choice scenes function Outofcoins() --native alert lack of zero coins local alertMessage = "Uh oh, looks like you've run out of coins! To continue reading the story, would you like to buy or gameble for coins?" native.showAlert( "Out of coins!", alertMessage, {"Gamble for coins", "Purchase coins", "Exit to Menu"}, choiceMade) end if (coins == 0) then -- conditional branch that alerts Outofcoins if no coins left Outofcoins() end function sceneGambleStart() function earntCoins() numberEarnt = 0 local coinsGot = display.newImage("/Images/coins_gold.png", 155, 275) coinsGot.alpha = 0 local function fadeOutCoinsEart() transition.to(logo, {time = 2000, alpha = 0}) display.remove(coinsGot) end local transitionFade = transition.to(logo, {time = 2000, alpha = 1, onComplete = fadeOutCoinsEarnt}) timer.performWithDelay(2000, transitionFade, 1) coinText.text = coins + numberEarnt end local function gamblerIntro() nameOptions.text = "Gambler" local bg = display.newImage("/Images/bg4.jpg", 155, 275) textRect = display.newRect(155, 525, 325, 200) textRect:setFillColor(.02, .02, .02) textRect.alpha = .6 local frames = display.newImage("/Images/windowframes_gold.png", 155, 275) display.newText(nameOptions) if (gambleVisit == false) then display.newText("\"Welcome to the coin gambling shop!\nHere's your chance to earn free coins\nwithout having to use the app store!", 165, 500, "Goudy Old Style Regular.ttf", 17) --display.newText("\"You can play here once a day if you\'ve\nNO coins in your inventory! You are\ngiven three tries at any game each visit.", 165, 500, "Goudy Old Style Regular.ttf", 17) --display.newText("\"So, then! What games will you play\nin our shop today? \n \n", 165, 500, "Goudy Old Style Regular.ttf", 17) else display.newText("\"Welcome back, player! You have\nthree tries left. So, what games\nwill you try your hand at?", 165, 500, "Goudy Old Style Regular.ttf", 17) end end local function sceneDiceRoll() --local show background graphics --draw dice on screen, with function ready to shake/transition on screen when accelerometer --transition hands up and drop dice animation -- if dice = # chosen then give coins end local function sceneCardChoose() -- a function that defines the mechanics of the card game. --draw several options on the screen: --3 cards, earn 5 coins. --6 cards, earn 15 coins. --9 cards, earn 30 coins. --The player needs 5 coins to read another chapter, but by increasing card numbers, --depending on the player's choice, show the images of the cards (with whatever numbers, always set) -- on the screen and allow the player to choose a card. Make a shuffling animation. -- lay all the cards on the screen, now with randomised positions defined by a number. --the player may choose one. Event listener, if the number defined = card number, the card flips, --shows its number, and the player wins the coins. defer to earntCoins. --if the player chooses the wrong card, show him a "WRONG CARD" result, and ask if he would like another --round or to exit to the main shop. return end local function sceneGuessNumber() --this game is not created, but is a dummy function that's shown here. It's included in the --options to show that if this were a real game, that's what it would look like return end end
The error message says all you need: "mainl.lua:160: bad argument #1 to 'newText' (string expected, got table) if you go to line 160 of your code you'll find the following: display.newText(displayNovelText) a few lines above you do this: local displayNovelText = display.newText("sometext") Refer to the display.newText documentation to find out how to use this function correctly. https://docs.coronalabs.com/api/library/display/newText.html You'll see that display.newText() does not return a string, but a text-object. It also does not take a text-object as input. That's what the error message is telling you. To access the text of displayNovelText you have to write displayNovelText.text which you can stuff into display.newText() among other options... Please make sure you always read the documentation of functions you use. You cannot be successful if you don't know what you are dealing with.
Builiding a selection from a Dataframe
i want to build a selection from a dataframe based on double search-arguments. In detail: I have build a search within a given Dataframe based on one value. This value can be given multiple times. The difference can be found in the row of the value. Here is a example: TECHNIKART FSZ BEZEICHNUNG FIRMA PRODUKT_SPANNUNG KLIMA EW_KW MENGE_KW LEISTUNG_KW Ü I get this Dataframe from following search in a bigger Dataframe: key = '71E' try: geraet_dat2 = geraet_dat[geraet_dat.FSZ == key] lang = len(geraet_dat2.index) print(geraet_dat2) My idea is now to have a if-else-query based on the length of the Dataframe. If the Dataframe has the lenght 1 i will print the values of the needed cells. If the Dataframe is longer than 1 the following popup appears: def abfrage_selektion(): popup_selektion = Tk() frame_selek = Frame(popup_selektion) frame_selek.pack() popup_selektion.configure(bg="Snow2") popup_selektion.geometry('300x250') popup_selektion.title('Bitte Gerät auswählen!') LABEL_SELEKTION = LabelFrame(popup_selektion, text="Bitte Gerät auswählen: ") LABEL_SELEKTION.place(x = 2, y = 2, width = 296, height = 246) INFO = ttk.Label(LABEL_SELEKTION, justify=CENTER, text="Diese FSZ ist mehrfach verfügbar! \nBitte das entsprechende Gerät wählen!") INFO.place(x = 50, y = 5) SEPTR_1 = ttk.Separator(LABEL_SELEKTION, orient=HORIZONTAL) SEPTR_1.place(x = 5, y = 40, width = 280) GERAET = ttk.LabelFrame(LABEL_SELEKTION, text="Geräte: ") GERAET.place(x = 15, y = 50, width = 260, height = 120) LISTE = Listbox(GERAET, yscrollcommand=True) LISTE.insert(1, '1') LISTE.insert(2, '2') LISTE.insert(3, '3') LISTE.insert(4, '4') LISTE.place(x = 5, y = 2, width = 240, height = 90) SEPTR_2 = ttk.Separator(LABEL_SELEKTION, orient=HORIZONTAL) SEPTR_2.place(x = 5, y = 180, width = 280) BUTTON_OK = ttk.Button(LABEL_SELEKTION, text="OK") BUTTON_OK.place(x = 5, y = 190, width = 280, height = 30) that far everything is nice an clear for me. But now the point i dont know how to solve: In the popup i want a selection from the given Dataframe with more than one Dataset to select the wanted Data. The criteria for the selection should be 'BEZEICHNUNG' and 'PRODUKT_SPANNUNG'. Do you have any ideas how i can do this? I searched in the web but didnt find a good solution for that. Thank you for you help!