Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello โ I'm @olemoritz on Twitter.
It's my first program for Pythonista
-
@ccc thereโs many links in a file, Function cannot pass variables.
-
The button (sender) has attributes... Here I used sender.title but you could also add a .url attribute to your buttons...
button1.url = "https://www.apple.com"
-
@ccc "les grands esprits se rencontrent" ๐, I just wrote
import ui v = ui.View() v.frame = (0,0,200,200) def b_action(sender): print(sender.url) b1 = ui.Button(title='Apple', frame = (10,10,80,32), url='https://www.apple.com', action=b_action) v.add_subview(b1) b2 = ui.Button(title='Google', frame = (100,10,80,32), url='https://www.google.com', action=b_action) v.add_subview(b2) v.present('sheet')
-
@ccc my button url is a variable.
def button_tapped(sender): self.webbrowser.open(href) #๏ผ๏ผ๏ผ v=ui.View(frame=(0,0,300,400)) with open('./wb.json', 'r') as f: wb = f.readlines() for i in range(0,20): wbi = wb[i] title = json.loads(wbi)['title'] href = json.loads(wbi)['href'] #href is the button url button = ui.Button(title=title) button.action = button_tapped button.frame = (0,i*25,450,20) v.add_subview(button)
I think I need 20 button.tapped functions.
-
Do you use GitHub? A repo with more complete code would help a lot. You definitely do not need 20 actions.
-
-
@Cheng when you create your buttons, set
button.href = href
and you want to use it, in action, do
.......open(sender.href)
-
-
-
You can write your data to a .json file and then read it back into a dict...
#!/usr/bin/env python3 import json data = { "Apple": "https://www.apple.com", "Google": "https://www.google.com", "IBM": "https://www.ibm.com", } with open("buttons.json", "w") as out_file: json.dump(data, out_file) del data # remove the in-memory instance with open("buttons.json") as in_file: data = json.load(in_file) for i, (title, url) in enumerate(data.items()): print(i, title, url)
-
I almost finished my code.
But still have a problem
When I tapped button0 TAP ,button0 does not disappear as sender.title = โ โ, and the new button has displayed.
And how to use remove_subview(button0)?import requests import re import json import ui, appex import webbrowser headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } data = { 'cate':'realtimehot' } def get_page(url): response = requests.get(url) html = response.text #print(html) return html def parse_html(html): #top = re.findall(r'class="icon-top"></i></td>.*?<td class="td-02">.*?<a href="(.*?)" target="_blank">(.*?)</a>.*?</td>', html, re.S) data = re.findall(r'ranktop">(.*?)</td>.*?<a href="(.*?)" target="_blank">(.*?)</a>.*?<span>(.*?)</span>', html, re.S) #print(top) #print(data) return data def write_data(data): with open(r'./wb.json', 'w', encoding='gbk') as f: for i in data: f.writelines(json.dumps(i) + '\n') print('done') def get_json(items, host): for item in items: yield { 'rank': item[0], 'href': host + item[1], 'title': item[2], 'num': item[3], } class control(ui.View): def __init__(self): self.frame=(0,0,400,600) appex.set_widget_view(self) def button_tapped1(self, sender): webbrowser.open(sender.href) def button_tapped(self, sender): sender.title = '' self.list() def layout(self): button0 = ui.Button(font=('<System>', 34), frame=(100,25,200,40), tint_color='red') button0.title = 'TAP' button0.action = self.button_tapped self.add_subview(button0) return button0 def list(self): host = 'https://s.weibo.com' url = 'http://s.weibo.com/top/summary?' html = get_page(url) data = parse_html(html) wb = get_json(data, host) write_data(wb) with open('./wb.json', 'r') as f: wb = f.readlines() for i in range(0,23): wbi = wb[i] title = json.loads(wbi)['title'] href = json.loads(wbi)['href'] #title = json.loads(wbi) button = ui.Button(title=title, font=('<System>', 18)) button.href = 'Alook://' + href button.action = self.button_tapped1 button.frame = (0,i*25,400,20) self.add_subview(button) def main(): control() if __name__ == '__main__': main()
-
# This button will self destruct. def button_tapped1(self, sender): webbrowser.open(sender.href) self.remove_subview(sender)
-
The real problem comes from the fact that layout is called two times, thus there are two buttons with TAP title...
Create your button0 in init and remove the layout def.
Or rename your layout into layoutx and call it in init:def __init__(self): self.frame=(0,0,400,600) appex.set_widget_view(self) self.layoutx() . . . def layoutx(self):
-
@cvp You are right . Function name can't be written casually.